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