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