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