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