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