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