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