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