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