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