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