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