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