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