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