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