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