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