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