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