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