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