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