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