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