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