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