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