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