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