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