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