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