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