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