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