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