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