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