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