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