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