# 数值

# 整数与浮点数

JavaScript 内部,所有数字都是以64位浮点数形式储存,即使整数也是如此。所以,1与1.0是相同的,是同一个数。

1 === 1.0 // true
1

# 数值的范围

64位浮点数的指数部分的值最大为2047,分出一半表示负数,则 JavaScript 能够表示的数值范围为2+1024到2-1023(开区间),超出这个范围的数无法表示。

Math.pow(2, 1024) // Infinity

Math.pow(2, -1075) // 0
1
2
3

# 数值的常量

Number.MAX_VALUE // 1.7976931348623157e+308
Number.MIN_VALUE // 5e-324
1
2

# 数值的特殊值

# 1. 正零和负零

-0 === +0 // true
0 === -0 // true
0 === +0 // true

+0 // 0
-0 // 0
(-0).toString() // '0'
(+0).toString() // '0'

(1 / +0) === (1 / -0) // false
1
2
3
4
5
6
7
8
9
10

# 2. NaN

NaN是 JavaScript 的特殊值,表示“非数字”(Not a Number),主要出现在将字符串解析成数字出错的场合。

5 - 'x' // NaN

0 / 0 // NaN

typeof NaN // 'number'
1
2
3
4
5

运算规则

NaN === NaN // false

[NaN].indexOf(NaN) // -1

Boolean(NaN) // false

NaN + 32 // NaN
NaN - 32 // NaN
NaN * 32 // NaN
NaN / 32 // NaN
1
2
3
4
5
6
7
8
9
10

# 3. Infinity

含义:Infinity表示“无穷”,用来表示两种场景。一种是一个正的数值太大,或一个负的数值太小,无法表示;另一种是非0数值除以0,得到Infinity。

// 场景一
Math.pow(2, 1024)
// Infinity

// 场景二
0 / 0 // NaN
1 / 0 // Infinity
1
2
3
4
5
6
7

正负:Infinity有正负之分,Infinity表示正的无穷,-Infinity表示负的无穷。

Infinity === -Infinity // false

1 / -0 // -Infinity
-1 / -0 // Infinity
1
2
3
4
Infinity > 1000 // true
-Infinity < -1000 // true

Infinity > NaN // false
-Infinity > NaN // false

Infinity < NaN // false
-Infinity < NaN // false
1
2
3
4
5
6
7
8

运算规则

5 * Infinity // Infinity
5 - Infinity // -Infinity
Infinity / 5 // Infinity
5 / Infinity // 0

0 * Infinity // NaN
0 / Infinity // 0
Infinity / 0 // Infinity

Infinity + Infinity // Infinity
Infinity * Infinity // Infinity

Infinity - Infinity // NaN
Infinity / Infinity // NaN

null * Infinity // NaN
null / Infinity // 0
Infinity / null // Infinity

undefined + Infinity // NaN
undefined - Infinity // NaN
undefined * Infinity // NaN
undefined / Infinity // NaN
Infinity / undefined // NaN
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 与数值有关的全局方法

# 1. parseInt()

基本用法: 如果parseInt的第一个参数不是字符串,会被先转为字符串

parseInt('123') // 123

parseInt('   81') // 81

parseInt(1.23) // 1

parseInt('1.23') // 1

parseInt('8a') // 8
parseInt('12**') // 12
parseInt('12.34') // 12
parseInt('15e2') // 15
parseInt('15px') // 15

parseInt('abc') // NaN
parseInt('.3') // NaN
parseInt('') // NaN
parseInt('+') // NaN
parseInt('+1') // 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

进制转换

parseInt('1000') // 1000
// 等同于
parseInt('1000', 10) // 1000

parseInt('1000', 2) // 8
parseInt('1000', 6) // 216
parseInt('1000', 8) // 512

parseInt('10', 37) // NaN
parseInt('10', 1) // NaN
parseInt('10', 0) // 10
parseInt('10', null) // 10
parseInt('10', undefined) // 10

parseInt(0x11, 36) // 43
parseInt(0x11, 2) // 1

// 等同于
parseInt(String(0x11), 36)
parseInt(String(0x11), 2)

// 等同于
parseInt('17', 36)
parseInt('17', 2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 2. parseFloat()

基本用法:parseFloat方法用于将一个字符串转为浮点数。

parseFloat('3.14') // 3.14

parseFloat('314e-2') // 3.14
parseFloat('0.0314E+2') // 3.14
1
2
3
4

特别之处:如果参数不是字符串,或者字符串的第一个字符不能转化为浮点数,则返回NaN。

parseFloat([]) // NaN
parseFloat('FF2') // NaN
parseFloat('') // NaN
1
2
3

# 3. Number()

  • 基本用法:Number方法,将非数字类型的参数,转换为数值类型。

  • 与parseInt和parseFloat不同之处:number可以将字符串以外的参数转换为数值,number方法没有进制转换的功能。

parseInt('1000', 2) //8
Number('1000', 2) //1000

parseFloat(true)  // NaN
Number(true) // 1

parseFloat(null) // NaN
Number(null) // 0

parseFloat('') // NaN
Number('') // 0

parseFloat('123.45#') // 123.45
Number('123.45#') // NaN
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 4. isNaN()

基本用法:isNaN方法可以用来判断一个值是否为NaN。

isNaN(NaN) // true
isNaN(123) // false
1
2

原理:isNaN只对数值有效,如果传入其他值,会被先转成数值。比如,传入字符串的时候,字符串会被先转成NaN,所以最后返回true,这一点要特别引起注意。也就是说,isNaN为true的值,有可能不是NaN,而是一个字符串。

isNaN('Hello') // true
// 相当于
isNaN(Number('Hello')) // true

isNaN({}) // true
// 等同于
isNaN(Number({})) // true

isNaN(['xzy']) // true
// 等同于
isNaN(Number(['xzy'])) // true

isNaN([]) // false
isNaN([123]) // false
isNaN(['123']) // false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

总结:isNaN传入的参数必须是数值,如果不是,会先将其参数通过Number()方法转换一次,如果转换数值失败,则该参数就变成NaN,所以isNaN再去判读该参数时,返回true,反之则是false。

# 5. isFinite()

基本用法:isFinite方法返回一个布尔值,表示某个值是否为正常的数值。

isFinite(Infinity) // false
isFinite(-Infinity) // false
isFinite(NaN) // false
isFinite(undefined) // false
isFinite(null) // true
isFinite(-1) // true
1
2
3
4
5
6