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