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