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