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