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