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