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