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