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