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