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