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