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