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