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