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