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