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