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