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