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