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