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