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