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