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