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