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