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