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