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