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