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