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