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