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