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