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