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