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