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