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