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