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