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