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