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