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