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