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