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