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