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