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