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