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