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