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