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