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