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