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