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