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