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