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