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