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