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