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