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