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