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