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