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