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