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