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