本文大量参考阮一峰老师的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()用来判断一个数值是否为整数。
有几个注意事项:
- 同样的,它对于非数值也很苛刻,一律返回false,即时非数值能转换成数值。
-
2.0
和2
在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.trunc
与Math.floor
等价,对于负数,Math.trunc
与Math.ceil
等价。
Math.sign()
Math.sign
方法用来判断一个数到底是正数、负数、还是零。对于非数值,会先将其转换为数值。
它会返回五种值。
- 参数为正数,返回+1;
- 参数为负数,返回-1;
- 参数为 0,返回0;
- 参数为-0,返回-0;
- 其他值,返回NaN。
如果参数是非数值,会自动转为数值。对于那些无法转为数值的值,会返回NaN。