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