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