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