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