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