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