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