ES6对Number和Math的扩展

本文大量参考阮一峰老师的ES6手册。

本文只整理最常用的扩展。

Number.isFinite()、Number.isNaN()

ES6对数值的主要扩展就是把原本是window的方法交给了Number

isFinite()isNaN()原本是window的方法,现在Number也有这2个方法。

Number.isFinite()用来检查一个数值是否为有限的(finite)。

Number.isFinite(15); // true
Number.isFinite(0.8); // true
Number.isFinite(NaN); // false
Number.isFinite(Infinity); // false
Number.isFinite(-Infinity); // false
Number.isFinite('foo'); // false
Number.isFinite('15'); // false
Number.isFinite(true); // false

Number.isNaN()用来检查一个值是否为NaN。

Number.isNaN(NaN) // true
Number.isNaN(15) // false
Number.isNaN('15') // false
Number.isNaN(true) // false
Number.isNaN(9/NaN) // true
Number.isNaN('true'/0) // true
Number.isNaN('true'/'true') // true

它们跟window的方法的区别是:

传统方法先调用Number()将非数值的值转为数值,再进行判断。

这两个新方法只对数值有效,两个新方法允许传入表达式,表达式的结果必须直接是数值,才有可能返回true,不是数值就一定返回false。Number.isFinite()对于非数值一律返回false,就算该非数值能转换为数值,也不去做转换。Number.isNaN()只有对于NaN才返回true,非NaN一律返回false。

parseInt()、parseFloat()

ES6 将全局方法parseInt()和parseFloat(),移植到Number对象上面,行为完全保持不变。这样做的目的,是逐步减少全局性方法,使得语言逐步模块化。

Number.isInteger()

Number.isInteger()用来判断一个数值是否为整数。

有几个注意事项:

  1. 同样的,它对于非数值也很苛刻,一律返回false,即时非数值能转换成数值。
  2. 2.02在js的存储机制上是一致的,所以Number.isInteger(2.0)是true。

Number.EPSILON

它表示 1 与大于 1 的最小浮点数之间的差。对于 64 位浮点数来说,大于 1 的最小浮点数相当于二进制的1.00..001,小数点后面有连续 51 个零。这个值减去 1 之后,就等于 2 的 -52 次方。

这个常量确实是一个定值,而且也能写出来,就是小数点后面51个0,然后跟一个1,这个值。但是它是干嘛的呢?

我们知道0.1 + 0.2 === 0.3是false,这就跟js的浮点存储机制有关系,是js天生不可避免的问题,ES6给出的解决办法就是,开发者自己定一个精度,误差在这个精度的就认为是相等的,就可以了。那么,我就可以写一个数值对比函数:

function isEqual (left, right) {
  return Math.abs(left - right) < Number.EPSILON * Math.pow(2, 2);
}

Math.abs是取绝对值,Math.pow(2, 2)是2的2次方,为什么是2次方,因为常量是2的-52次方,乘以2的2次方,等于2的-48次方,这种误差值在不涉及金融、科研的领域,就够用了。

然后我们测试一下:

isEqual(0.1 + 0.2, 0.3) // true

Math.trunc

Math.trunc方法用于去除一个数的小数部分,返回整数部分。

对于非数值,Math.trunc内部使用Number方法将其先转为数值。

对于空值和无法截取整数的值,返回NaN。

对于正数,Math.truncMath.floor等价,对于负数,Math.truncMath.ceil等价。

Math.sign()

Math.sign方法用来判断一个数到底是正数、负数、还是零。对于非数值,会先将其转换为数值。

它会返回五种值。

  • 参数为正数,返回+1;
  • 参数为负数,返回-1;
  • 参数为 0,返回0;
  • 参数为-0,返回-0;
  • 其他值,返回NaN。

如果参数是非数值,会自动转为数值。对于那些无法转为数值的值,会返回NaN。

你可能感兴趣的:(ES6对Number和Math的扩展)