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