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