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