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