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