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