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