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