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