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