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