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