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