数值

原文地址:https://wangdoc.com/javascript/

概述

整数和浮点数

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

1 === 1.0 // true

也就是说JavaScript语言的底层更本没有整数,所有的数字都是小数。容易造成混淆的是,某些运算只有整数才能完成,此时JavaScript会自动把64位浮点数转成32位整数,然后再进行运算。
由于浮点数不是精确的值,所以涉及小数的比较和运算要特别小心。

0.1 + 0.2 === 0.3 // false
0.3 / 0.1 // 2.9999999...

(0.3 - 0.2) === (0.2 - 0.1) // false 

数值精度

JavaScript浮点数的64位,从左边开始是这样组成的。

  • 第1位:符号位,0表示整数,1表示负数
  • 第2位到第12位(共11位):指数部分
  • 第13位到第64位(共52位):小数部分(即有效数字)
    精度最多只能到53个二进制位,这意味着,绝对值小于2的53次方的整数,即-253到253,都可以精确表示。

数值范围

JavaScript能够表示的数值范围为21024到2-1024(开区间),超出这个范围的数无法表示。
如果一个数大于等于2的1024次方,那么就会发生正向溢出,即JavaScript无法表示这么大的数,这时就会返回Infinity

Math.pow(2, 1024) // Infinity

如果一个数小于等于2的-1075次方(指数部分最小值-1023,再加上小数部分的52位),那么就会发生负向溢出,即JavaScript无法表示这么小的数,这时会直接返回0。

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

JavaScript提供Number对象的MAX_VALUEMIN_VALUE属性,返回可以表示的具体的最大值和最小值。

Number.MAX_VALUE
Number.MIN_VALUE

特殊数值

正零和负零

JavaScript内部实际上存在2个0:一个是+0,一个是-0,区别就是64位浮点数表示法的符号位不同。

-0 === +0 // true
0 === -0 // true
0 === +0 // true
(+0).toString() // "0"
(-0).toString() // "0"
(1 / +0) === (1 / -0) // false

上面的代码之所以出现这样结果,是因为除以正零得到+Infinity,除以负零得到-Infinity,这两者是不想等的。

NaN

含义

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

5 - 'x' // NaN

宁外,一些数学函数的运算结果会出现NaN。

Math.acos(2) // NaN
Math.log(-1) // NaN
Math.log(-1) // NaN
0 / 0 // NaN

需要注意的是,NaN不是独立的数据类型,而是一个特殊数值,它的数据类型依然属于Number,使用typeof可以看的很清楚。

typeof NaN // "number"

NaN,包括它本身。

NaN === NaN // false

数组的indexOf方法内部使用的是严格相等运算符,所以该方法对NaN不成立。

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

NaN在布尔运算时当做false

Boolean(NaN) // false

NaN和任何数(包括它自己)的运算,得到的都是NaN

Infinity

Infinity有正负之分,Infinity表示正的无穷,-Infinity表示负的无穷。
Infinity大于一切数值(除了NaN),-Infinity小于一切数值(除了NaN)。

与数值相关的全局方法

parseInt()

基本用法
parseInt方法用于将字符串转为整数。

parseInt("123") //123

如果字符串头部有空格,空格会被自动去除

parseInt("     81") // 81

如果parseInt的参数不是字符串,则会先转为字符串再转换。字符串转为整数的时候,是一个个字符一次转换,如果遇到不能转为数字的字符就不再进行下去。如果字符串第一个字符就无法转化为数字,就返回NaN

parseInt("8a") // 8
parseInt("abc") // NaN

parseInt的返回值只有两种可能,要么是一个十进制整数,要么是NaN
parseInt可以接受第二个参数(2到36之间),表示被解析的值的进制。超出范围返回NaN。如果第二个参数是0undefinednull,则直接忽略,按10进制返回。
如果字符串包含对于指定进制无意义的字符,则从最高位开始,只返回可以转换的数值。

parseInt("1567", 2) // 1
parseInt("567", 2) // NaN

如果parseInt的第一个参数不是字符串,会被先转为字符串。这会导致一些令人意外的结果。

parseInt(0x11, 36) // 43
parseInt(0x11, 2) // 1
// 等同于
parseInt(String(0x11), 36)
parseInt(String(0x11), 2)
// 等同于
parseInt("17", 36)
parseInt("17", 2)

parseInt(011, 2)
// 等同于
parseInt(String(011), 2)
// 等同于
parseInt(String(9), 2) // NaN

parseFloat()

parseFloat([]) // NaN
parseFloat("FF2") // NaN
parseFloat("") // NaN

parseFloat的转换结果不同于Number函数

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

isNaN

isNaN可以判断一个值是否为NaN
**需要注意的是,只有一个数值成员的数组的数组,isNaN返回false

isNaN([]) // false
isNaN([123]) // false
isNaN(["123"]) // false

因此再使用isNaN之前最好判断一下数据类型。

function myIsNaN(value) {
    return typeof value === "number" || isNaN(value);
}

判断isNaN更好的方法是利用isNaN是唯一不等于自身的值的这个特点进行判断。

function myIsNaN(value) {
    return typeof value === "number" || value !== value;
}

isFinite()

除了Infinity-InfinityNaNundefined这几个值会返回false,其余的都返回true。

原文地址:https://www.cnblogs.com/chris-jichen/p/9926105.html