|
|
( Q" X+ Z) }) Q- [<h1 id="前端之javascript">前端之JavaScript</h1>
' V) t5 Z6 V; d9 s& `, }<p></p><p></p>
3 k$ w0 ]6 J2 ~4 K% \; ?<h2 id="1-javascript-发展历史">1. JavaScript 发展历史</h2>
9 l4 e Z/ V# i7 `<p>JavaScript(通常缩写为JS)是一种高级的、解释型的编程语言。JavaScript是一门基于原型、头等函数的语言,是一门多范式的语言,它支持面向对象程序设计,指令式编程,以及函数式编程。<br>
# s1 M. W: @7 p) X它提供语法来操控文本、数组、日期以及正则表达式等,不支持I/O,比如网络、存储和图形等,但这些都可以由它的宿主环境提供支持。<br>+ x: |4 F$ K3 G- J
它已经由ECMA(欧洲电脑制造商协会)通过ECMAScript实现语言的标准化。<br> v! ~% u2 Z9 P d
它被世界上的绝大多数网站所使用,也被世界主流浏览器(Chrome、IE、Firefox、Safari、Opera)支持。</p>
; \) l% c4 z3 E! s! @/ h% n6 m/ m" P: n<h2 id="2-javascript基础语法">2. JavaScript基础语法</h2>6 n9 `6 O0 [8 E% ^3 a
<h3 id="21-注释">2.1 注释</h3>
( f* E: U1 R9 B k3 r8 ~4 a: U- _) _<p>在<code>JavaScript</code>中单行注释使用<code>//</code>,多行注释<code>/**/</code></p>/ j* j2 Y. O$ q
<pre><code class="language-javascript">// 这是单行注释$ H. m/ q+ w7 K+ s7 P! m
) I! x% n! c. ]; D% P
/*
( k# O8 T) I! r- W2 A这是多行注释的第一行,6 `% E3 b# w, g8 Z
这是第二行。7 H! [, L9 i+ X5 N
*/; W$ e- Q+ j* q
</code></pre>0 d# R& ?. ]; P4 W& P
<h3 id="22-变量和常量">2.2 变量和常量</h3>6 {3 S/ G8 R4 E$ d4 i# T
<p>在JavaScript中使用<code>var</code>和<code>let</code>定义变量:</p>
" K+ O( a! {3 N \. L1 w<ul># c" z. G* ?& W/ U. i. Y# s
<li>变量必须以字母开头</li>- |# h, }9 K }! O$ L& O
<li>变量也能以 $ 和 _ 符号开头(不过我们不推荐这么做)</li>
" V0 ~% C# s; g<li>变量名称对大小写敏感(y 和 Y 是不同的变量)</li>
& I" i& i8 n: o' O- m</ul>
, _6 b0 C8 z- f, V" ?<p><code>var</code>定义的都为全局变量</p>
( G! E& h* v2 V9 F7 m6 P<p><code>let</code>可以声明局部变量</p>
y% i, w) b7 n% `4 P2 \5 t9 V<p><strong>声明变量:</strong></p>
- F" t$ k' R9 E! O9 F! c! N/ q/ J( }<pre><code class="language-javascript">// 定义单个变量
7 [% ~( D2 I5 \2 O' b> var name8 s+ y8 n+ H4 s9 A% s
> name = 'Hans'& F3 i w! \+ z% u3 k
//定义并赋值
. J. a' u& D9 r; Q( Q> var name = 'Hans'
# E% }( [" Y! ^, R& ?3 f4 }> name! s. o5 |% A) @- u `) y; ]
'Hans'
" l: e2 V% Q3 V6 z$ J5 `8 A4 \0 d% \& n
// 定义多个变量7 Z3 B- i9 \) s o8 j1 r
> var name = "Hans", age = 18
& L8 D0 Z: G% w6 K/ _. _, y> name" o! d' Y" C( c1 ^. x+ b
'Hans'8 y) H( G% b0 ?. V5 s
> age
0 Y0 A* g8 n$ e% J8 o/ s186 `( d0 w) u/ c3 _# w9 M, T
% u" N+ J) J7 J+ q/ p9 l
//多行使用反引号`` 类型python中的三引号. b* b: P# G& d. }0 l0 J( j
> var text = `A young idler,
9 \2 ]( D( A D7 ?- t1 Jan old beggar`
* c2 ~; I6 o6 a+ I> text
% _/ ?, n$ t- H4 f& b5 y'A young idler,\nan old beggar' {: {: B' W5 Q# ]* w
</code></pre>
' B: [. k5 L9 s2 l<p><strong>声明常量:</strong></p>
# s) C2 v" x8 r0 s% ]1 _7 H% D<p>在<code>JavaScript</code>中使用<code>const</code>定义常量</p>
% P2 N1 l! Q- i3 ?& c" M: p<pre><code class="language-javascript">> const pi = 3.14, K1 K3 a7 S3 W! `7 ~7 ]; H
> pi" ?* d$ I2 v1 Q: }
3.14
7 X. e! f! K. \5 Q7 v5 Y* Y+ _6 [1 d> pi = 3.01
+ ?$ l+ o# D0 K. zUncaught TypeError: Assignment to constant variable.8 Z" B; u# U# A4 @. ^: Z
at <anonymous>:1:4) d d7 D5 d5 [: u! _5 d: J
! O! D. P% Y; A- b
</code></pre>0 |6 @- B+ l8 H# A
<h3 id="23-基本数据类型">2.3 基本数据类型</h3>4 l: k6 {0 R5 S* O J; B- a
<p><strong>值类型(基本类型)</strong>:字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol(表示独一无二的值,ES6引入)。</p>8 Z9 Q3 c( Q+ A' S
<p><strong>引用数据类型</strong>:对象(Object)、数组(Array)、函数(Function)。</p>9 S7 a: ^3 j0 L: K8 G
<h4 id="231-number类型">2.3.1 Number类型</h4>5 f' x) j/ z0 M* u: o* |; ^
<pre><code class="language-javascript">> var a = 5
! d% g5 l& N* j" U> typeof a //查看变量的类型
5 E& Z6 e+ {# P' L4 z' x' t1 A# l. Cnumber, ]) j, Z. z0 w$ ]6 W$ H
* D6 k3 a! C, ]) d+ [, _, B+ r& Q
> var b = 1.3, W- k% v! ]; U
> typeof b8 j' R% `+ N- c3 F
number/ c+ A0 f8 B% h4 }4 B/ ]9 X
8 q$ q" i8 Z6 E
// 不管整型还是浮点型打开出来的结果都是number类型
6 P; s; n$ D8 u5 t% n6 D3 X, X* P6 _! W
/* m& e2 ^, P e* p) t4 M+ s
NaN:Not A Number
1 a. ]$ X$ j# p& f( X1 F5 F2 V' kNaN属于数值类型 表示的意思是 不是一个数字
8 N8 D0 h' {" o& J. d! O! p* e/ C*/
9 J/ b$ H" C; q
0 j4 k9 ^& a& Q/ ~( N. q0 v# lparseInt('2345') // 转整型3 `2 z8 M8 k2 U A( V0 u3 P' e/ ?5 x( u
2345
: B/ D# J% @8 j5 e+ T+ q5 fparseInt('2345.5')8 P" F! S+ w7 C: H: m8 _
2345' m# p3 e3 T+ o) q( F8 I
parseFloat('2345.5') // 转浮点型" I. }7 t u+ `7 C% K; S
2345.5
/ n2 I2 [6 F) M) c( J! K9 YparseFloat('ABC')
$ I% p; ?1 m: Q: }8 _NaN
1 J# r; Y; N/ L: HparseInt('abc')) Q8 P6 a% C8 k2 |0 z$ w% w
NaN
% U+ x0 Z2 E9 s6 l/ n- E</code></pre>
8 r5 \; ~+ X5 r6 J: y<h4 id="232-string类型">2.3.2 String类型</h4>! W& v0 B/ _$ y
<pre><code class="language-javascript">> var name = 'Hans'
, t9 @2 V; n2 p; g> typeof name
7 t4 ?$ Q2 |# A4 b9 Z'string'& j5 r+ C& q w3 |2 {% M2 ^
/ d) u7 a) |( y9 i. ]2 Q//常用方法
0 h* J8 J! _* B' s# x// 变量值长度0 B1 |- S) J j) H. a' L5 K
> name.length
# i3 t) Z6 C3 b2 U/ `46 }2 s/ i" ]6 f3 |% P
// trim() 移除空白
; d8 v- r% r, B2 T8 r* S> var a = ' ABC ', _& l- O* t+ e& w
> a
. U# s' I& ^, {/ c1 Z) a5 A, `% q' ABC '
8 H) _2 E. ^ s% m: q% b L> a.trim()
& L6 t3 d' j" n$ y4 z( r+ _7 x'ABC'. A% [/ m" a( n9 X) J5 D, r
//移除左边的空白' L- H7 V) z1 P3 o. j1 P' ]
> a.trimLeft()
% G* `+ q9 V( M5 n& y'ABC '# R7 s' t" G$ o. p2 G+ \
//移除右边的空白2 J2 h; W; o% V3 n5 j' D4 |
> a.trimRight()
, i0 X: w7 N7 t6 ~( k8 I7 q1 H$ R; L' ABC'5 n9 |; K( w7 I( O* b1 `) p
5 s, [+ Y" L4 I//返回第n个字符,从0开始- ~8 k; l# A* ^4 v, k [
> name! P1 l6 w( U5 V V% h' f
'Hans'
4 @1 C' {% R$ v& i$ K6 j5 n! |> name.charAt(3)+ \* N( Z1 M1 r% h7 p# z
's'
B2 V1 {! k: J! Q# ]- x> name.charAt()
) Y) d# Y- [% k'H'
9 s0 L; m+ E+ J$ x; d/ A! ~ ?7 O> name.charAt(1)" W1 I& V9 y+ K2 i
'a'
* l4 F( H( f3 ?0 A# H5 X G' {% b+ f. C/ w* s/ A
// 在javascript中推荐使用加号(+)拼接
! ]1 E5 c: ^& F0 r3 O" c, n> name
$ M* r# H) l( P: @' a1 h'Hans'
3 Z6 g5 o& K3 e! P> a
5 S" i0 x. Q9 B9 ?7 |' ABC '
/ r0 X9 _3 Q* Y; W> name + a* q i6 H. Y( X
'Hans ABC '
i% G4 s: A0 T* ~1 _- e// 使用concat拼接& E, d' i- z3 D
> name.concat(a); K" I, `/ B/ [$ g( \; {7 R
'Hans ABC '3 V8 o/ p$ X8 g% X; A: S
- ?& W* i- x3 E1 o, r% I; M//indexOf(substring, start)子序列位置8 X. m) X+ X. `% E& T
* b2 ~. V8 A( P1 q
> text) I. Z6 S" r% i" D. q0 t
'A young idler,\nan old beggar'
9 r \0 S& ~* z, R% p6 Q) ?7 ?8 d> text.indexOf('young',0)0 ]$ Z6 k8 ] C/ t6 \
2
' R! X8 _( k: K# Z5 t( b; v' |8 O1 ]
3 r1 l2 [* c8 R+ Q//.substring(from, to) 根据索引获取子序列
3 i" T5 Z* }' a/ G R( _ ~% P0 B> text.substring(0,)
/ `4 ~- M) G3 C' r'A young idler,\nan old beggar'
$ x; W+ _9 o' X6 y+ r> text.substring(0,10)
& a- s9 K- ^' a6 ]'A young id') f( ]5 t: ]; t1 ]1 @6 Z/ O) D
1 D3 k3 I- Y1 F3 v// .slice(start, end) 切片, 从0开始顾头不顾尾6 o+ x0 z' ~' D3 r
> name.slice(0,3)
4 X+ B) t1 o0 [. H/ D'Han'
* l# D. g& g9 y; ?& d
1 ~8 ^0 E) h% F- ?( `$ t! [// 转小写 }( y' {( B+ G- U$ A3 R* C
> name+ G# k- c0 m! Y5 I, F
'Hans'
# H/ Y+ v9 s! R' s1 E> name.toLowerCase()
1 n( z. `5 x3 q, s6 u. G'hans'
* ^! F5 a! Y/ f3 J// 转大写
# { N3 `. b! A/ A> name.toUpperCase()
& c2 u) Y5 u8 G- H'HANS'
. n* ? N: n: Z8 m& I
7 ~, ]# f3 Y! y; F9 L# I/ J// 分隔6 K- o+ v4 I# i D
> name; ]6 j+ l$ U) [( o7 _
'Hans' p/ _& c9 t6 J/ S- l) f+ ?- |) u
> name.split('a')1 o4 }* n8 _9 D0 ^
(2) ['H', 'ns']$ o6 N' ?8 R# y( |, W, h( Q
</code></pre>
5 H7 Z- m# L, ^; @; l! S<h4 id="233-boolean布尔值">2.3.3 Boolean布尔值</h4>
6 n! E/ w+ t9 g8 h: s* ?<p>在<code>JavaScript</code>中布尔值<code>true</code>和<code>false</code> 都是小写</p>2 b2 w3 x/ i# E L
<p><code>""(空字符串)、0、null、undefined、NaN都是false。</code></p>
3 ^+ g/ i* E& {0 b0 M<p><strong>null和undefined</strong></p>
% q( h: C+ P- T<ul>
, Y2 S# b% j* E: E# B- t<li>null表示值是空,一般在需要指定或清空一个变量时才会使用,如 name=null;</li>5 ~* a' O8 h7 A9 f0 w
<li>undefined表示当声明一个变量但未初始化时,该变量的默认值是undefined。还有就是函数无明确的返回值时,返回的也是undefined。</li>
) \" o" _8 S* e O7 E- y</ul>
4 {: V. \2 t0 O* U2 ~, d<h4 id="234-array数组">2.3.4 Array数组</h4>
% B, y# z. m3 [) R<p>使用单独的变量名来存储一系列的值。类似<code>python</code>中的列表。</p>
M) s" J1 f3 N. }6 k<pre><code class="language-javascript">> var array1 = [1, 2, 3, 'a','b','c']
& T5 J# g) \5 q> array1; V4 l& u. L' }, {& I$ J
(6) [1, 2, 3, 'a', 'b', 'c']' k9 `1 ?& W6 d4 C/ V
> console.log(array1[2]) //console.log打印类似python中的print! u. e0 z0 [6 X" w; c, e
3. Y, t6 Q+ b( T
// length元素个数
3 I, p9 ~" g/ m9 \9 k' g> array1.length
# h2 X" a" Z* {& F) w0 J: }6
2 {! w+ t% k1 ]2 ]% l// 在尾部增加元素,类型append
# ~' J. z# O& a+ |/ U> array1.push('D')* r! G" u6 E% G1 ?* J
7
' D) \0 a1 w8 v1 [> array1, j( h5 m1 e7 j- d( s
(7) [1, 2, 3, 'a', 'b', 'c', 'D']6 m4 r, F4 Z4 z5 e$ E
// 在头部增加元素
7 u# a# Q) s1 O$ E; X& R" `8 O> array1.unshift(0)
/ D; |/ j! N( a3 n8
) J) Y; p% k- l! j @: r& o* [> array18 }& J" R! F, N3 A
(8) [0, 1, 2, 3, 'a', 'b', 'c', 'D']
7 U4 ~! |7 H# K. O4 J6 n+ O* A% k- g, G+ J8 t
//取最后一个元素0 C! r2 A8 s$ x' N, e Q2 q" W# f
> array1.pop()- ]( f+ h1 y$ x* S5 w7 t
'D'
4 E) y" a" S3 _& M/ ^> array1
6 e/ u, W& v3 l(7) [0, 1, 2, 3, 'a', 'b', 'c']
7 y' q$ a* B& k$ v b1 T6 ^//取头部元素5 K) b3 ^- P( E( f% I
> array1.shift()
9 |# @1 i3 r" C3 N' Z% v0+ s! ^" h) T) n! R! q9 z5 K
> array1! h' `; S! u+ N' y, E
(6) [1, 2, 3, 'a', 'b', 'c']
( w4 B+ V. f$ X1 Q6 R
4 Q8 b' a0 c. ?% e7 w0 A6 A//切片, 从0开始顾头不顾尾
# M5 Q7 P4 S! `! G3 D2 `6 |> array1.slice(3,6)' J" S( g4 c7 j! R( d5 d% o3 X
(3) ['a', 'b', 'c']% e( w0 f6 }& i" h) A. E. }
// 反转8 ^/ Q2 D( R/ N& x! D. \- J
> array1.reverse()
3 U) X R% x8 F/ Y2 p7 U# B# T(6) ['c', 'b', 'a', 3, 2, 1]/ h# G$ Y* u/ _2 O. G
// 将数组元素连接成字符串+ ~7 i3 s& X5 W, C4 D! i
> array1.join() // 什么不都写默认使用逗号分隔
% B5 A& c: E3 ^5 w0 `'c,b,a,3,2,1'
n+ g! }8 K" E> array1.join('')6 v6 x. L' Y! M4 B% N$ h# f
'cba321'( c) P4 j5 Y6 L0 c [ J9 t
> array1.join('|')
) b4 F6 _/ J+ e# g$ J& D7 F3 W3 Q'c|b|a|3|2|1'& S- L$ p5 @& L1 {3 k! [; g. w
- c$ D# o& L! Y- b
// 连接数组5 E6 ]; Z7 i7 H1 s+ x
> var array2 = ['A','B','C']& @( g' a* S- P5 C: H4 a0 G
> array1.concat(array2)" v! h3 e* F; J, b0 a
(9) ['c', 'b', 'a', 3, 2, 1, 'A', 'B', 'C']3 ^, p* [) F) n6 _, \. W
5 R) Y: Y& P) |5 c
// 排序5 r) [% o6 @$ g: }6 e5 ]
> array1.sort()
) w0 Y$ X Z( W* L7 E(6) [1, 2, 3, 'a', 'b', 'c']& G9 {0 {. _# _3 q2 _
: Q$ b S6 m: U$ n
// 删除元素,并可以向数据组中添加新元素(可选)
( l1 w8 u1 o8 c# ^0 O> array1.splice(3,3) // 删除元素1 T, H6 k$ ?. F. l1 M l5 l/ ^3 h
(3) ['a', 'b', 'c']) v: l7 h, |1 o
> array1. e+ B, u2 s/ M ^9 e1 N
(3) [1, 2, 3]1 X$ W9 N4 p1 S5 E, @. _7 @
> array1.splice(3,3,'A','B','C') // 删除元素从添加新元素
0 b: O5 D( T) \ E8 M8 h. D1 x- I9 K[]
8 v2 h3 F: \) i7 z> array1
( t" K. W. { n. I! \" K(6) [1, 2, 3, 'A', 'B', 'C']7 ^0 ~0 R2 g2 y6 x) G; N7 G$ b
1 H. {$ H6 [! o- k6 l) x# E/*0 R# o% q: o* z; X4 R `( U [
splice(index,howmany,item1,.....,itemX)
8 _3 Q/ x+ u9 Z7 ]index:必需,必须是数字。规定从何处添加/删除元素。, O- P2 C$ T# [ t) m
howmany: 必需。规定应该删除多少元素。必须是数字,但可以是 "0"。如果未规定此参数,则删除从 index 开始到原数组结尾的所有元素。
: `+ J* f1 u, i% M" i3 Ritem1, ..., itemX 可选。要添加到数组的新元素- {. j$ A$ B2 @$ ?% [- v
*/
& a& V( B! p! c1 q5 s. m9 u
2 ^! r2 _3 A* m$ j7 p8 x( L// forEach() 将数组的每个元素传递给回调函数
) T1 @ @1 j$ v: }" z) R1 @> array1.forEach(function test(n){console.log(n)}). o& o/ n( S& T) C$ z. q
1; ~+ Y. [. u' {6 N
2
* _1 I5 u# R0 i# F$ P7 w5 f) D 3
1 m# w6 j6 L% P t& i# U$ W) h A0 { X! F2 S" @8 T# w
B
& V" j% Z* @$ ]8 P; ^$ J/ X7 t C" @+ e1 i# i! g/ s+ `, W+ O$ d1 G) w
// 返回一个数组元素调用函数处理后的值的新数组, I3 p4 I+ k( A/ k2 H& Z! o
> array1.map(function(value){return value +1})7 r1 {5 A+ j* n0 n9 B
(6) [2, 3, 4, 'A1', 'B1', 'C1']
# q5 H* o+ b9 u- N</code></pre>
8 v6 `+ m2 z) o. `<h3 id="24-运算符">2.4 运算符</h3>
- ^/ E& n0 M: z& ^, @<h4 id="241-数学运算符">2.4.1 数学运算符</h4>
' G1 D; [ L( {: d8 W- {<p><code>+ - * / % ++ --</code></p>+ w4 \8 R. r1 L+ f! Z/ N
<pre><code class="language-javascript">> var a = 6
7 F( J" b5 w$ G# Y> var b = 3) m" Q- C+ F& r( H/ X) P
// 加
+ P5 E5 w! [/ Q6 {" H# k4 Q/ W. x> a + b
6 m: _5 n# e+ j$ E9 X. }9
0 e" \& l6 D7 S6 t// 减
/ C; b" [4 M% B> a - b6 @" V: ^7 p. \7 O0 I$ z/ `9 ]$ w8 A
3
. a9 ~8 y3 u4 e6 r4 B// 乘
& m: ^# W3 ^: m# w> a * b3 K, H8 T* S. j( Y
18
h) ]2 p' d4 f( Q3 L// 除8 i8 h" ~4 x- ^2 {6 |
> a / b
, I5 d8 Y! ]" U" O! y3 ?" a2
0 Q# X# | p9 A4 G: w/ O- S Z// 取模(取余)
2 {2 O! l5 K) [- p& V- n8 t8 l> a % b. M. W4 G9 I8 z
0
2 V# l2 J0 t5 U7 _! b// 自增1(先赋值再增1): n0 |2 f& ]6 W: t! j6 q" g
> a++
2 E" ~- S% J# j1 r, P! Y& x/ }9 c6
5 B& `5 A' Z( ~+ P I8 i> a
1 h3 C6 z5 @6 u: Q) H5 Y* Z, Y7. u+ B! _7 I9 ]4 f
// 自减1(先赋值再减1)
) x9 s1 @5 w+ @4 }9 e> a--8 G7 G+ f% S+ u* C
7
( ^( z% q# @9 m0 b/ g% g) l( ]" E> a
# c6 W+ j- L0 m, A: W" I( D! R5 q6
4 y6 G( h$ m- a. z" i// 自增1(先增1再赋值)
2 v; r9 j8 i8 A( S4 L( r/ p( h> ++a9 j: t: |( J C! D+ j! L
7
c6 \" D: \2 ]" h$ E// 自减1(先减1再赋值)5 c* B( B" z: N% m0 b2 \. L- o, q
> --a
; c6 c, c3 d m/ c, t. p60 W7 a6 C7 X: F) Q: B i5 h
> a9 r. W2 L4 Y6 r' H1 ~
6
* O0 ^8 d( s+ u% y8 d- Z% r. I! M; t6 N) `! R
//a++会先赋值再进行自增1运算,而++a会先进行自增运算再赋值,--同理2 R( X. n; A) m! @) U$ z
</code></pre>9 ~4 W! s" \) i
<h4 id="242-比较运算符">2.4.2 比较运算符</h4>
0 Z8 L8 Q3 L, A. K! l1 j2 w, J<p><code>> >= < <= != == === !==</code></p>
4 l( A" O6 g2 w. h5 F<pre><code class="language-javascript">// 大于) I) @2 _. v% @, q: N5 e5 `# _* D
> a > b
4 C8 ^ \. o" _true! H: R6 P4 z' o+ S, p6 C
// 大于等于
3 C% A- s. l' p> a >= b
- f. z& z/ y- Atrue
" A! Q4 L, U- d// 小于, D$ h. ^$ I+ k' J) h0 ~
> a < b5 e( t. q7 a% o# G" V* O
false
0 R8 J7 U) j+ ^, N {// 小于等于1 T6 S8 S1 A& G* Z/ I5 T
> a <= b
) ^& O9 T" ~) A' T( [false
) H3 Y% Q+ H/ Z2 u8 s2 Y$ s// 弱不等于
1 _ v. }/ U3 X> a != b3 x, D# u! K K$ E$ t$ H9 e. e
true6 G2 X% e, [# }0 p8 ~
// 弱等于
5 w* A5 P! Q- T* R1 t& I. S> 1 == '1'! j" o8 h2 f- Y
true
" q$ {: N8 [- H# x9 ~8 t3 e// 强等于
' K, B- L0 ]% I C2 n5 E> 1 === '1'$ i# ~9 X/ D5 F1 g/ o# S- S3 s
false
) @" `2 e' Z: b// 强不等于5 c F& }8 l% }9 ]/ \& f
> 1 !== '1'
7 _) J4 c8 s) R. E/ O: o( htrue) ?$ z0 @$ h1 E8 Q, l4 C0 Q& }
( K+ O4 [6 `: J4 H( ?! K3 J7 h
/*; m o, O5 t- n9 E3 s) W; o
JS是一门弱类型语言(会自动转换数据类型),所以用两个等号进行比较时,JS内部会自动先将数值类型的1转换成字符串类型的1再进行比较,所以以后写JS涉及到比较时尽量用三等号来强制限制类型,防止判断错误* M5 U9 o- I8 l( n% K6 B0 O+ o
*/
3 F4 }+ ~) O9 B3 D1 M1 F</code></pre>
) {4 e' ?; N% Q6 A- X" u$ ]) O<h4 id="243-逻辑运算符">2.4.3 逻辑运算符</h4>* V" c% p. L4 k- d
<p><code>&& || !</code></p>) o, L1 d% d+ U \7 T' R
<pre><code class="language-javascript">&& 与# E2 P d8 M2 |9 z" T( S6 `4 ~/ a
|| or ; |( E0 p% f* p! }
! 非; c9 E+ l' @& y7 F
</code></pre>
7 \& C2 {! M# r7 @<h4 id="244-赋值运算符">2.4.4 赋值运算符</h4>( W& ?" l, d: t# {
<p><code>= += -= *= /=</code></p>7 i/ I/ t* B% a9 m
<pre><code class="language-javascript">// 赋值) @7 r4 G6 E! e; V
> var x = 3
% W( n1 _( F! @" M5 ~// 加等于% i$ k8 g" u; X3 n: ]6 `2 R% X
> x += 2
8 a- F { N p9 T0 ]7 O/ t/ S5
& i0 R# k$ n8 u3 T+ n# i// 减等于" F0 h% w5 B4 Z; t3 `6 F
> x -= 1
) r4 E7 X4 U- o Z8 N q4& j) i0 @+ W& |5 v4 X m/ |& x
// 乘等于/ @7 X! A0 F3 D$ A8 J i: E6 ^
> x *= 2
/ _$ t3 o4 u9 b5 ?4 O: R7 y5 l8: d0 D3 y' {3 y
// 除等于
8 t3 c; i8 k! ]+ \: E> x /= 2
, [. n- n+ F- v4
- J1 |* H2 x! x9 |. r. J</code></pre>
: ~) T- K" l6 J4 e& `# a" }<h3 id="25-流程控制">2.5 流程控制</h3>* B& C' S3 a9 {8 r1 u
<h4 id="251-if">2.5.1 if</h4>
0 p {+ p& {7 j2 H# a4 R<pre><code class="language-javascript">1, if(条件){条件成立执行代码}0 X. d9 |/ x0 a7 y& Z, M
3 O) D* ?, n L1 q# i' |* w; R
> var x = 31 a0 J/ I6 H: c* ]0 j! b9 j
> if (x > 2){console.log("OK")}
- `5 t1 Y1 Q# G% z# C# y OK
' J. ^8 i# k; {8 S2 `# a9 Y; J& U3 i+ o2 m! E% P! s. z
2, if(条件){条件成立执行代码} 4 m" a' ^8 L9 h- e; Q' Z7 ~
else{条件不成立执行代码}( M ?7 R6 U3 J3 V4 ?, [& g
. F" y& D. N1 s% z& V7 q0 y> if (x > 4){console.log("OK")}else{"NO"}) Z* M7 {' q+ g/ g" ^; v
'NO'! m, H7 e% i% Z |( G m* P' L
$ y8 S8 ~$ t+ U. v" Z. @8 K
3, if(条件1){条件1成立执行代码}
9 A; y# S y" P8 U2 l else if(条件2){条件2成立执行代码}
. J2 y& H8 w( W; E5 |: q/ O else{上面条件都不成立执行代码}0 D( ?# Y m7 S( }
, |5 C. S2 T2 f+ ~7 ?
> if (x > 4){console.log("OK")}else if(x > 5){console.log("OK2")}else{console.log('Ha')}
, z2 L) U) n9 Y1 w t/ c Ha
E; E9 t4 \! l( J7 G</code></pre>3 s; W, m, d; |0 L. x" t
<h4 id="252-switch">2.5.2 switch</h4>, J7 v; N2 D i+ }, R& h
<pre><code class="language-javascript">var day = new Date().getDay();
; N4 {4 X8 a9 T- W& x2 |& Qswitch (day) {
* A, N3 K! \% R' B1 a+ Z. ?& K case 0:
' C! h# ~/ H; _+ r5 M console.log("Sunday");, O) A5 k f9 @: u7 I
break;# A9 G7 L. ?- S% U
case 1:9 h' Q2 [ k4 Y: _$ X
console.log("Monday");
' E( H- W; t/ Q# M1 p break;
0 b5 N4 Z% r3 Ddefault:
G- ?7 X" E& J console.log("不在范围")
H, U/ p* ^! K( ~# ?0 z* d, J}
$ W- |% H- S, F+ y 不在范围
" W* b+ z1 |% r9 R& S2 m( [2 j' W</code></pre>! K% q/ B/ F3 @ N8 g* {+ K
<p>注意:<code>switch</code>中的<code>case</code>子句通常都会加<code>break</code>语句,否则程序会继续执行后续<code>case</code>中的语句。</p>2 o6 I' K5 d* N G- v. D
<h4 id="253-for">2.5.3 for</h4>
, F# `9 e% v7 V<pre><code class="language-python">// for 循环
! B" ^+ E7 w4 U; O0 L. n for(起始值;循环条件;每次循环后执行的操作){9 T4 h2 R4 k* T. P2 `1 ]6 b( m
for循环体代码! U5 d3 M" M r' S& B9 e% {
}
" g I, e% U- M/ _7 {! g, o/ h8 Y" K+ B
for (var i = 0; i<10; i++){
# u" U3 t$ J7 Q6 k1 r& ~6 D console.log(i)1 N+ j6 c) D( {& V
}- l$ e4 G& m6 f) ?$ I8 v
0
. a7 T9 }3 k* Y" q 15 U7 a) B9 n) c1 O0 L2 T) h- M; d
2; \/ G4 r; A9 U
3* X8 \ F4 J2 P7 z8 ^7 |% i
4
- q# }8 T! f( h0 v3 S 5/ Q @. L. x/ s- Q
6# N/ X7 U L, q. A
74 a- c, a$ g. [ j1 A d2 O& N" C
83 E$ l% l6 ?+ k" \, t5 K
9
2 U" d6 H5 s, U, }' S( O</code></pre>
0 y5 s5 _. p3 A<h4 id="254-while">2.5.4 while</h4>7 R, `7 N5 Y( V* k6 s. t5 |
<pre><code class="language-javascript">// while 循环
$ S% ]5 i& K0 r. D while(循环条件){
9 b1 L, \; F X1 e 循环体代码$ g) S! f! u" X* B' H! X
}9 d" z$ X8 K7 o% V) `0 a
) R0 v1 g! {. i$ P% f# a: X* N# g
> var i = 0
, Y) D5 K. u/ n! }2 r( c9 }0 ]> while(i<10){' T: _0 ]" H }* X: L0 J+ E; j
console.log(i)
w: f2 Y2 o4 _ P i++
! f' m3 m" Q! R" j8 b1 a}
0 H" X+ l$ p$ P. _ 06 [1 U+ e5 _ L/ m' f
1# q7 T6 V4 h9 c/ |5 \" B
2
, H) z2 X! G" V2 l- _7 q9 b7 R! [% X 3+ M6 Y" _. @( k
4
! i7 o, S# j% J3 `: C3 { 5' `- a0 _3 F$ {+ E/ u* n- \
6
3 h( m! t" v* t6 g r5 Y: @- h 7
3 j2 Z8 p" ?0 e/ s6 N/ }1 y4 a 8
8 l! d7 Y W" Z% O8 R' r( i 9
' x8 P3 T6 a- Q5 @</code></pre>
9 e9 L6 w! | P& D5 s<h4 id="255-break和continue">2.5.5 break和continue</h4>
$ g' z! j3 W7 m8 j8 K0 {<pre><code class="language-javascript">// break8 H& X# x/ f4 P" Q `1 h/ {
for (var i = 0; i<10; i++){
' }2 T9 ?3 G; b5 T$ i! m( F2 W, K if (i == 5){break}1 G8 x$ C% \7 d: }
console.log(i)2 U9 W' B: P1 a' M
}( R$ q0 M2 B/ M* _
0
2 E) O9 m0 b G9 C 1 d+ H# a3 Y# K; x3 U9 |2 z% ?
2
0 M8 L: n# w, E' h) g% i, s5 r 3$ A7 v$ @# u: g
4 S( ]& D( K8 }. x: G- `
// continue
- |* [% }4 e' O4 j+ I: V* ffor (var i = 0; i<10; i++){
% H$ \# V, q9 [ if (i == 5){continue}2 P: g% l" I- ]4 K% T: f
console.log(i)
, @+ P* p3 A1 k' f3 |7 k}; o' q/ B+ `, C# z- D( v
0
3 K8 d% x6 r" I' z* C 1
4 d) }/ [3 b2 ]% y) a3 q) ] 2
3 A' p: N8 v7 K! y( ] 3$ j3 t* X5 A$ [: n- m; p6 T
4; o. }# z7 Z- t# H$ O2 D1 e" N9 D. m( W
6
9 @6 N& t9 x0 P, g 7: O | }, d0 R! T
8
5 A) j S' @* h$ U& [# w 92 U: y$ _* o1 \1 c, ^+ J
; I+ C% D( i/ @( f</code></pre>9 w& f; t) A. O# }. u: l% I, u, d: D1 x
<h3 id="26-三元运算">2.6 三元运算</h3>% G' A7 w7 R+ r" O, V
<pre><code class="language-javascript">> a! P6 u; c- N- D
6
+ t) O5 J8 V5 S7 F4 G- ^+ V" ~> b
7 A& L" E1 ^; m% X3 N* E# R: V# _- ^3
4 u6 M2 p7 ^% Q6 j8 f1 _1 G0 y3 j0 ^9 V6 p7 I
//条件成立c为a的值,不成立c为b的值) A/ V5 L% }2 `3 F) i
> var c = a > b ? a : b$ S# M4 ?9 O% c v
> c
w* w+ K" O8 Z7 S6
: f8 W @' a1 K+ {+ Z# B# D; U; S; e7 Q. `3 V* j, W% c% x* b8 f+ f
// 三元运算可以嵌套
3 f6 C% ^5 z ~: c, c3 V& p</code></pre>3 n( G, B8 X, x& y% S2 b/ x
<h3 id="27-函数">2.7 函数</h3>6 p; c3 M) ~' f+ Y6 J: u* |
<pre><code class="language-javascript">1. 普通函数
, H. \1 S% m2 h7 S" j> function foo1(){) h& d9 r$ X) L: i" T; h
console.log("Hi")
! Z3 ^& i8 A8 L0 ?4 h}
8 }' ?$ i" L J# T1 Z
( X( V, r: X) K# c> foo1()" V( X3 F0 W4 t. I# z; [4 n
Hi
0 X& v) \ W2 q+ I5 I; |6 V2. 带参数函数& j" K2 F/ ?3 R3 |6 h1 q
> function foo1(name){2 x/ p1 q2 X. \8 `
console.log("Hi",name)
5 M& Z; L% i% b2 ]}
6 c& g2 n8 Q' t6 g/ G) e
7 N3 Z1 x( B" t/ S. y3 M X> foo1("Hans")
3 L5 y6 Z, r; }2 E) AHi Hans1 ^0 m4 ]/ {9 ^7 A* ?
9 U/ l1 f* B# P2 }
> var name = "Hello"
, n, p1 _5 k/ z> foo1(name)
H/ A, R% a# l) b2 h0 ~% FHi Hello( `" V4 i+ d5 x/ }0 N- l" {) Q* Q
2 z) }5 M+ {! d4 O& e0 s2 y3. 带返回值函数 S3 h% o# Q& h, Q
> function foo1(a,b){
" y# G1 f, F3 g6 e return a + b 9 \" `. z& {# i# p; g7 u/ {6 x0 N
}1 k8 \/ d. \) A9 y/ o0 y" Y; F
> foo1(1,2)2 L# W, W$ w* w. Z) q& W! v4 Y
3" G, z( N9 {1 c7 P
> var a = foo1(10,20) //接受函数返回值
( N9 [# Y( i# T$ {4 g" Z> a
5 d/ o3 K: [! i7 {! S301 x1 u* J2 @ S. u9 s7 D6 ]
2 f" K& Q( r, E7 |
4. 匿名函数
7 G$ i: H# C. D0 a7 }7 ?> var sum = function(a, b){4 X0 l c- U" K7 _; S4 A8 ]
return a + b;
; i+ H9 H! h, g2 U- U' k! x" a* _}+ _, C) ]3 E3 f8 w0 T% [" {
> sum(1,2)" o# c( s* g9 A1 |+ ~
3
5 H- \% \4 Q/ ~+ t- b7 P0 v% U2 y$ {5 J6 \ e1 l, O: z
// 立即执行函数 书写立即执行的函数,首先先写两个括号()()这样防止书写混乱
) E8 K7 ?8 p9 X1 x0 Y> (function(a, b){
' r( r+ c7 z2 M, R return a + b8 K+ U+ W) s- X9 ?
})(10, 20)
1 |% S7 k8 B, u5 v30
: w# {! a' z; \( A, m
7 H% l7 D5 l6 e5 u- p. r5. 闭包函数
6 x* z5 u+ T! x+ Q" {$ v// 内部函数可以使用外部函数的参数,这个内部函数就是个闭包函数; g& s+ h. ~ z9 P
var city = "BJ"
8 x: n- @; m1 u9 O, \function f(){
8 V; u9 h! V& A var city = "SH"
+ a& m1 B0 M e$ d! ^3 s L function inner(){; f0 j0 K' M; d# s* I3 O
console.log(city)
" Y! z+ }: _( i6 x& L! U# f V }7 e$ {& m: B7 J6 Q
return inner/ I, Q+ B$ z1 L5 E5 S$ o2 c
}; b, Y: K# r+ d8 H5 k/ G& I
var ret = f()
* q( D" k! G; f# W" X6 `) Nret()
' Z/ N+ w" Z' s* S1 J; Z( e. A! \' l执行结果:" T6 N' i0 U/ J! M
SH
( i7 ]! d) o B; v: F. s" m2 m/ j) N2 c+ W& r4 r, t
</code></pre>
4 x# `6 `7 }) H" Z) b3 q% L<p>ES6中允许使用“箭头”(=>)定义函数。</p>
9 h- Z0 n! e! I<pre><code class="language-javascript">var f = v => v;
5 R' e' l2 L) ^. Q/ A9 R" T// 等同于3 j$ j3 {& p q2 a. K) X' t. z, ^7 B
var f = function(v){
/ G/ o& Z- D8 x1 p3 T5 R return v;
- {& X" J' i" ]/ Y, {}
6 _) m3 X H) w0 ?</code></pre>, M- R. @+ d$ _9 ^
<p><code>arguments</code>参数 可以获取传入的所有数据</p>
" Q) d" u7 p7 ~- A/ ]( ]1 Z<pre><code class="language-javascript">function foo1(a,b){' V9 v5 L0 p* s: g8 q
console.log(arguments.length) //参数的个数
5 q e) |2 i9 n! t2 F% d; n+ t& j: w console.log(arguments[0]) // 第一个参数的值
, A$ `# P8 Q+ h- y6 ] U return a + b 7 q: V( E; ?1 Z6 w# ]9 {3 J
}
0 J1 I: e' T& _2 R A7 C! c0 ofoo1(10,20)
/ T' z) o8 J) _4 ~) ^结果:4 L4 z" T6 m$ A$ d
2 //参数的个数
$ X3 U' }/ Q* M) ?4 q+ ^$ ?$ I10 // 第一个参数的值
: Z8 m+ k2 j2 Y30 // 返回相加的结果9 e) K( S! E3 s
</code></pre>6 a F- W Q! J4 \. e* i
<p><strong>注意:</strong>函数只能返回一个值,如果要返回多个值,只能将其放在数组或对象中返回</p>
. W' X( g) X2 W7 }) G" J: T1 b<h3 id="28-内置对象和方法">2.8 内置对象和方法</h3>( o( x1 A/ O/ D4 J9 x. l3 A* [
<p><code>JavaScript</code>中的所有事物都是对象:字符串、数字、数组、日期等。在<code>JavaScript</code>中,对象是拥有属性和方法的数据。</p>
$ {6 Y/ r" K5 k V4 ^( ]<h4 id="281-date对象">2.8.1 Date对象</h4>: f: F# G2 g2 N) M G* D7 c$ b
<pre><code class="language-javascript">> var data_test = new Date()
" }# p. }, N. L. ^> data_test4 A# b O2 f7 L/ R" r, [
Fri Feb 11 2022 21:44:43 GMT+0800 (中国标准时间)
/ I8 d H# C7 F> data_test.toLocaleString()- f5 A8 T$ ~. V. Q
'2022/2/11 下午9:44:43'% ~; k b( M7 Z* K" n- s2 Q7 t
. q- Z: ~7 j+ m* Y9 `; y* u> data_test.toLocaleDateString()
, f2 e+ ]( T4 I* i- \6 U) J% y'2022/2/11'- C- p5 R2 p( c
: ^8 @) Y% Q2 Z) y
> var data_test2 = new Date("2022/2/11 9:44:43")' I/ i% H5 h1 Z0 J
> data_test2.toLocaleString()
$ U) q m* K2 Q/ v/ w( A+ D'2022/2/11 上午9:44:43'
+ n/ U i4 a6 M$ X; Z! I
2 b* g: x' T. V5 r0 q( e! M+ ?// 获取当前几号
) h' l' f4 M$ H' x0 Y i> data_test.getDate()8 |) W% A; u$ r
11
" B9 S: v, @5 t3 |/ e) Q// 获取星期几,数字表示
4 X( v- P$ t0 F% J0 C4 F0 @> data_test.getDay()
) k2 {, Y& ]0 E$ i* H2 Y57 h7 H0 c& R" K& b3 T6 J/ N* A5 D
// 获取月份(0-11)' r$ n! F5 h$ O2 l2 [* ?- V
> data_test.getMonth()+ B3 f) W% Q8 |
17 Y' N0 [; o: S% H8 E2 y
// 获取完整年份3 ^' w+ a$ L2 G5 o f$ `( i1 P: d
> data_test.getFullYear()' z& |+ E/ Y# _ J% T' V+ f
2022/ |5 \" {) A3 {) v5 i; O
// 获取时
: y! C9 w4 }$ }, l+ a' E- X> data_test.getHours()
0 H+ W' U: u4 n) S) Q9 L# z21
, p9 Z% W& N& Z# @7 d$ e// 获取分2 ~1 a+ X# y* w7 n5 ?5 H ~
> data_test.getMinutes(). `# A, C x$ o: E; W7 `5 n
44
/ |6 r+ I! Y$ l& l. p3 f! f// 获取秒( ~4 a; |, @# c9 f& E" |& L$ X
> data_test.getSeconds()
% X" m) p% u* Y% ]43
, K- ^% H$ ? t+ e- |// 获取毫秒
* P0 Y9 f5 t, x- b5 v+ x# B8 U> data_test.getMilliseconds()
( D# k9 k y& z290
$ y8 j1 ?8 r6 \# S% Q// 获取时间戳
0 h6 ?& E: ?; k, h( @$ }/ f> data_test.getTime()3 v t( w; N- O* Q9 N; p( H& k
1644587083290
( C( z1 [0 g/ M0 E</code></pre>
3 C3 i# U# M5 ^0 x5 Y) t" D<h4 id="282-json对象">2.8.2 Json对象</h4>9 i' Y8 v2 H+ x& j
<pre><code class="language-javascript">JSON.stringify() // 序列化, 把对象转换成JSON字符串
+ e8 X+ R: E# V: oJSON.parse() // 反序列化,把JSON字符串转换成对象
! h7 N) Y' y3 B& J$ L$ g& V( ~# @* n/ A% w9 ]6 d2 L) n, G6 I
// 序列化
0 }% G( ~4 e5 G2 f/ |! O> var jstojson = JSON.stringify(person)
; [: @2 X9 d9 S+ X+ V9 N> jstojson
# Q+ ?% A* y9 y5 s. [( Q) r'{"Name":"Hans","Age":18}'5 q4 N: }) v& q6 o9 g+ S5 V4 M
8 C( k+ r3 n2 B) l% ^! L& B// 反序列化
8 q P5 e- D5 Y" ]6 }> var x = JSON.parse(jstojson)( Z4 u# L2 k* n2 \# C; S: o. \& K" H
> x& l8 w1 j/ k5 p+ h' r8 _: b
{Name: 'Hans', Age: 18}
% _+ i C$ Q* s% W9 q> x.Age3 W5 s( U2 h1 w/ U$ u3 D- h+ f
18
! T3 W9 j: j2 o" a2 \</code></pre>
* j/ S* l: a' I( z9 H4 Y2 X<h4 id="283-regexp对象">2.8.3 RegExp对象</h4>
0 f2 u/ ^% q4 S% V<p>正则</p>
_; s g7 U; M e<pre><code class="language-javascript">> var reg1 = new RegExp("^[a-zA-Z][a-zA-Z0-9]{4,7}");
4 t8 ^6 X1 |( X. k/ ~" e> reg1
- K1 k5 T: _! @. z6 x8 e/^[a-zA-Z][a-zA-Z0-9]{4,7}/9 A- U8 S/ E- b0 L2 g7 |; z
> reg1.test("Hans666")
, g z) Z* [) R$ `& i: utrue
/ m/ J' L; q7 S, }% L
f' j: V; u& p4 F3 i+ c! y> var reg2 = /^[a-zA-Z][a-zA-Z0-9]{4,7}/ // 推荐这种写法使用 /正则/( d8 Z8 {# B6 @! R t5 H8 n8 A
> reg2
" J6 h! c M, a2 P/^[a-zA-Z][a-zA-Z0-9]{4,7}/
" S3 j$ E7 {; U! F' K; c> reg2.test('Hasdfa')6 k0 M0 |1 U2 D1 |
true0 K% u5 V6 A, L5 q& Z% [9 }+ A; O1 A, J
& C- C L( [! R- ~
全局匹配:. X' j, {1 W) e& c, M
> name
9 P/ F2 e7 x" D8 o: n }'Hello'; m. `" `" b/ v& K& k
> name.match(/l/)
6 @& Y/ n1 p* K6 i9 q8 i['l', index: 2, input: 'Hello', groups: undefined]. H$ S% L( F5 e* g. ]( n
. `% c% a# l, e: x! h0 y0 k7 g> name.match(/l/g)# b. _9 @+ B( I7 d: m
(2) ['l', 'l']# ] L* |; `* ]: p. K8 j8 u
// 正则表达式的最后不加g则表示匹配成功就结束 加g表示全局匹配
, i) h" O/ p7 h4 e3 }7 ~4 E' v3 Y, W
全局匹配注意事项:
5 ]$ p7 J: a6 C! j7 ~> var reg2 = /^[a-zA-Z][a-zA-Z0-9]{4,7}/g
7 s% W- f3 V Z, M( j2 b5 q9 M> reg2.test('Hasdfa')5 M7 ~& ~ b8 s) h: E; C; z# W
true: u3 ~& U) f# \1 Z
>reg2.lastIndex; E8 K* |7 S" g6 K
6' u4 S5 x3 l u( @9 p" o9 J( P
> reg2.test('Hasdfa')
) z- B$ V- @/ ~8 N) S2 e; J8 G Q1 {7 Sfalse
7 h. Y; R: T4 n4 ^/ Q> reg2.lastIndex;
0 l) V. B, s) }5 ]7 `1 S# v8 Z5 z0& ]; T4 @" R2 O$ P: \
> reg2.test('Hasdfa')
/ v( F0 w' U8 H4 N5 c5 p! Jtrue
; x# v$ Y% @# E, p1 v/ V; X0 [> reg2.lastIndex;
" Q' a3 H% W3 P( q6
$ l4 R, D; w" c2 x> reg2.test('Hasdfa')
& \- @: H6 d" Z$ I- d4 `: Wfalse/ P) n" b* I* E3 Y9 j9 L
> reg2.lastIndex;
; s& R) D$ B6 ^% T0
+ \ Y, k! d a- O! v// 全局匹配会有一个lastindex属性4 b. @9 G3 m1 `8 e
> reg2.test()
5 n$ f! v. }( k$ Q* {. efalse
/ l* H M5 V& b. ]( Y> reg2.test()
9 ]! r" ?3 b" f8 @true
/ m9 W9 M1 i8 h1 q( \// 校验时不传参数默认传的是undefined3 Y: X$ M; L9 Q
</code></pre>( _9 w% p) i: D2 Q8 c$ R- o* F. v" O
<h4 id="284-自定义对象">2.8.4 自定义对象</h4>
' }+ k1 A& _$ `2 L2 a4 |/ m<p>就相当于是<code>python</code>中的字典</p> |/ K# e& d4 p2 t0 Y0 i
<pre><code class="language-javascript">> var person = {'Name':"Hans", "Age":18}3 A5 t, r+ H$ k! B( q
> person# |; B+ Z8 u6 x; A7 h, r
{Name: 'Hans', Age: 18}" t5 r3 Q% K: O# ^3 e1 v5 ~' r9 P( \
> person.Name
# {' p( k' ?# A% A'Hans'
. r+ e: d7 l" m8 N2 h- [4 O( R> person["Name"] n: g* \1 |9 m) c* q
'Hans'
, u0 P! W9 z) z. P" P& Y) h, @+ m4 o1 h
// 也可以使用new Object创建
# M" {: y+ u% I! W; J. @* `5 `* ~5 [> var person2 = new Object()$ O; ?8 I; h$ D4 J7 T
> person2.name = "Hello"
8 t* ]8 g: }" ^3 e'Hello'
3 H. c. \$ x9 z* S2 G8 h- I> person2.age = 20; w) A- S) E5 ?. x3 _' I
20& z0 H$ i1 _! T1 f n
</code></pre>
' z4 t5 q ^" z3 R$ D% Z7 e<h2 id="3-javascript-bom和dom操作">3. JavaScript BOM和DOM操作</h2>
+ q1 w3 o" g/ w0 e5 G, c+ S+ r& F<p>BOM(Browser Object Model)是指浏览器对象模型,使用js操作浏览器。</p>; j+ k! ?; ^4 c9 J
<p>DOM (Document Object Model)是指文档对象模型,通过它,可以访问HTML文档的所有元素。使用js操作前端页面。</p># z4 A: r0 y! K$ O
<h3 id="31-window-对象">3.1 window 对象</h3>
: H. n. x" |! t4 A; t( }<p>所有浏览器都支持 window 对象。它表示浏览器窗口。</p>
* b+ h$ ]8 u% E' i# `<pre><code class="language-python">//览器窗口的内部高度5 x5 a1 z! h' P. b+ Q& w
window.innerHeight
' p8 B9 c0 { }7 v4 @( J706
5 y) K# f& }) S9 u* M6 s" @5 G( X& e9 V//浏览器窗口的内部宽度
' V& F# ^: q# g$ H* V" @& @window.innerWidth
1 S, J* b9 Z7 V* z" _$ [1522: D% B8 _7 ^5 @1 l/ E' H
// 打开新窗口2 E( F) t* G v2 U
window.open('https://www.baidu.com')
( k/ t5 h# W5 ?- Y+ Y& z% SWindow {window: Window, self: Window, document: document, name: '', location: Location, …}* Y3 A# s }0 a6 ?' h7 P% z) a5 P
// 关闭当前窗口
. ?2 |: R% J- g0 h( m1 v$ uwindow.close()
4 b- l0 Y2 `" t5 W6 i/ Y7 S; M* f// 后退一页' C( e6 `. V9 Y$ A. Z& y# X
window.history.back()
5 A, ]1 {* w/ w6 s' p) n% x* t+ O" m// 前进一页
8 q) t+ R/ U# c+ q Hwindow.history.forward() # N6 I7 R& s% l! s3 _/ f8 N
//Web浏览器全称
& ~, m' m$ o! x& J6 Cwindow.navigator.appName
+ ]' A, J6 s/ @; T |'Netscape'
9 X6 G6 M+ Y2 t f; k) ^// Web浏览器厂商和版本的详细字符串9 G/ E& @) N' X8 O% v5 ^5 D
window.navigator.appVersion
# l1 q. n) \* G) b( C, H' ]'5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36'+ V+ w4 w! w2 Z, k( w9 o4 T7 |' g7 L
// 客户端绝大部分信息! Q2 O; q8 m6 v( T5 q
window.navigator.userAgent$ v+ m+ _3 d5 p# a
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36'5 W+ x8 C7 b4 Z- x7 K4 q
// 浏览器运行所在的操作系统
% T% F3 h+ ]7 s% Rwindow.navigator.platform
. B2 E, A9 D% h$ M'Win32'* `# |+ a/ A: x, }& v! P
/ H2 H' o( `% H- T( ~// 获取URL" @! L0 g4 |' R( _) G7 ?5 S7 K- o
window.location.href. L+ F, p9 V/ U
// 跳转到指定页面
2 X: a6 i8 v: s7 E& l$ Fwindow.location.href='https://www.baidu.com'4 s& k" X7 V$ p9 e! t! M
// 重新加载页面
( f: R/ ~, @( e. m* V% ^window.location.reload()
9 X! u# S9 \9 |: C2 x</code></pre>
- }& e. y- F0 u+ r" z; D<h3 id="32-弹出框">3.2 弹出框</h3>' Q J4 k/ ^0 K: U& m h; Y
<p>三种消息框:警告框、确认框、提示框。</p>8 m/ @0 @$ u2 b; Y! K5 X2 v( Q
<h4 id="321-警告框">3.2.1 警告框</h4>4 f3 w! o* }$ [1 j: f0 o
<pre><code class="language-javascript">alert("Hello")1 A0 Y! v3 s6 ~% P% K
</code></pre>
4 |$ V, l; Z8 ]9 Z: _, A1 U% \<p><img src="https://img2022.cnblogs.com/blog/723171/202202/723171-20220211225243640-1572156192.png" ></p>
# I5 q- w2 e& H: m s5 i6 P6 a' u<h4 id="322-确认框">3.2.2 确认框</h4>
# _ [% J* @8 ^8 e+ e<p><img src="https://img2022.cnblogs.com/blog/723171/202202/723171-20220211225205414-770035518.png" ></p>
7 q$ L& E8 a' Y% v8 l- j# [" \<pre><code class="language-javascript">> confirm("你确定吗?") // 点确认返回true
: y: `+ G, w' L3 m& Z Strue
6 R' g* W; q1 q+ ]9 M" b> confirm("你确定吗?") // 点取消返回false/ s' i: }1 T" u- p7 V% d2 ^$ h
false8 r1 }8 q+ T$ P' k- ]
</code></pre>$ G5 u! F9 S* g
<h4 id="323-提示框">3.2.3 提示框</h4>
' Z$ }& ?$ G1 x& Q9 P* p8 Q<p><code>prompt("请输入","提示")</code></p>5 W6 L3 P" a" Q* Z+ a, \
<p><img src="https://img2022.cnblogs.com/blog/723171/202202/723171-20220211225311668-600169621.png" ></p>
3 P: O0 T' N& c<p>如果直接点<code>确定</code>后端得收到提示两个字,也可以删除输入自己想输入的内容、</p>( R% d! P) {! Q* a) m# q
<p>如果直接点<code>取消</code>后端收到<code>null</code></p>0 m8 {5 E" B" Y1 V, [# S
<h3 id="33-计时相关">3.3 计时相关</h3>
6 D( m. ^' U: X8 _8 e<p>在一定时间间隔之后来执行代码,而不是在函数被调用后立即执行。我们称之为计时事件。</p>; \% l% M P4 ^+ k- v# ~
<pre><code class="language-javascript">// 等于3秒钟弹窗
h) i7 Q/ I5 ~0 K- `; R, |setTimeout(function(){alert("Hello")}, 3000)
/ t- M# Q6 O, S' }2 v; ]
6 `5 j# q; m0 z7 tvar t = setTimeout(function(){alert("Hello")}, 3000)/ M& E" J, m' z( k! U! o
7 S& |; t7 H' A: j# [# Y
// 取消setTimeout设置2 I/ b; J4 z2 q, {. G: y
clearTimeout(t)
* Z) L5 k; Z. e+ Q. }5 [</code></pre> I- ?6 V# p% h% _5 c. o$ e' [4 E) r
<p><code>setTimeout() </code>方法会返回某个值。在上面的语句中,值被储存在名为 <code>t</code> 的变量中。假如你希望取消这个 <code>setTimeout()</code>,你可以使用这个变量名来指定它。</p>" \0 N$ ]# `1 F& V; l% H4 L! f, c; \
<h4 id="331-setinterval--间隔指定的毫秒数不停地执行指定的代码">3.3.1 setInterval() 间隔指定的毫秒数不停地执行指定的代码</h4>
+ [) e P+ H) p5 h7 b<pre><code class="language-javascript">每三秒弹出 "hello" :
" Z7 E% ~) \$ C$ I" v5 A9 KsetInterval(function(){alert("Hello")},3000);
- t7 ~$ I- E( {</code></pre>
* C( O7 V8 R& _/ I' D+ J<p>取消使用<code>clearInterval() </code>方法.它用于停止 <code>setInterval() </code>方法执行的函数代码。</p>
$ T2 J7 N m/ q0 i& Y+ X<pre><code class="language-javascript">var t = setInterval(function(){alert("Hello")},3000);3 w, l- ^9 j, A/ c" n9 Q
//取消:
2 C6 `3 u6 s4 H/ v# m$ ?) M7 d) aclearInterval(t)
% b, l" g/ R$ n# H! z9 }% ^. `</code></pre>/ y, d8 Y8 i* q6 y5 T1 V% C
' l# _) p0 b8 T- N: c, ]/ d |
|