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