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