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