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