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