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