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