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