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