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