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