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