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