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