- Number.isFinite
Number.isFinite()用来检查一个数值是否为有限的(finite),即不是Infinity
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
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
- Number.isFinite、Number.isNaN和全局方法isFinite、isNaN的区别
它们与传统的全局方法isFinite()和isNaN()的区别在于,传统方法先调用Number()将非数值的值转为数值,再进行判断,而这两个新方法只对数值有效,Number.isFinite()对于非数值一律返回false, Number.isNaN()只有对于NaN才返回true,非NaN一律返回false。
// 先调用Number()将非数值转化为数值判断
isFinite(25) // true
isFinite('25') // true
// 不转化直接判断,对非数值一律返回false
Number.isFinite(25) // true
Number.isFinite('25') // false
// 同isFinite,先转化后判断
isNaN(NaN) // true
isNaN("NaN") // true
// 同Number.isFinite,直接判断
Number.isNaN(NaN) // true
Number.isNaN("NaN") // false
- Number.parseInt和Number.parseFloat
ES6 将全局方法parseInt()和parseFloat(),移植到Number对象上面,行为完全保持不变。这样做的目的,是逐步减少全局性方法,使得语言逐步模块化。
// ES5的写法
parseInt('12.34') // 12
parseFloat('12.345#') // 123.45
// ES6的写法
console.log(Number.parseInt(12.34)); // 12
console.log(Number.parseFloat('12.345#')); // 12.34
Number.parseInt === parseInt // true
Number.parseFloat === parseFloat // true
- Number. isInteger
如果对数据精度的要求较高,不建议使用Number.isInteger()判断一个数值是否为整数。
// 数值
Number.isInteger(25) // true
Number.isInteger(25.1) // false
Number.isInteger(25.0) // true
// 非数值
Number.isInteger() // false
Number.isInteger(null) // false
Number.isInteger('15') // false
Number.isInteger(true) // false
// 误判
// 小数的精度达到了小数点后16个十进制位,转成二进制位超过了53个二进制位,导致最后的那个2被丢弃
Number.isInteger(3.0000000000000002) // true
// 一个数值的绝对值小于Number.MIN_VALUE(5E-324),即小于 JavaScript 能够分辨的最小值,会被自动转为 0。
Number.isInteger(5E-324) // false
Number.isInteger(5E-325) // true
- Number.EPSILON
一个数值很小的常量,主要用于浮点数计算,Number.EPSILON可以用来设置“能够接受的误差范围”。
0.1 + 0.2
// 0.30000000000000004
0.1 + 0.2 - 0.3
// 5.551115123125783e-17
// 误差范围设为 2 的-50 次方(即Number.EPSILON * Math.pow(2, 2)),即如果两个浮点数的差小于这个值,我们就认为这两个浮点数相等。
console.log(0.1 + 0.2 - 0.3 < Number.EPSILON * Math.pow(2, 2)) // true
// Number.EPSILON的实质是一个可以接受的最小误差范围。
- 安全整数和Number.isSafeInteger
// 安全整数范围 -2的53次方 到 2的53次方(不包含两个端点)
Math.pow(-2, 53) < Safe Integer Number < Math.pow(2, 53)
// 超过安全范围之后计算失真
Math.pow(2, 53) === Math.pow(2, 53) + 1 // true
// ES6引入最大最小常量,表示这个范围的上下限
Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1 // true
Number.MIN_SAFE_INTEGER === Math.pow(2, 53) + 1 // true
// 用来判断数值是否位于安全整数范围内
Number.isSafeInteger('a') // false
Number.isSafeInteger(null) // false
Number.isSafeInteger(NaN) // false
Number.isSafeInteger(Infinity) // false
Number.isSafeInteger(-Infinity) // false
Number.isSafeInteger(3) // true
Number.isSafeInteger(1.2) // false
Number.isSafeInteger(9007199254740990) // true
Number.isSafeInteger(9007199254740992) // false
Number.isSafeInteger(Number.MIN_SAFE_INTEGER - 1) // false
Number.isSafeInteger(Number.MIN_SAFE_INTEGER) // true
Number.isSafeInteger(Number.MAX_SAFE_INTEGER) // true
Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1) // false
// 函数实现
Number.isSafeInteger = function (n) {
return (typeof n === 'number' &&
Math.round(n) === n &&
Number.MIN_SAFE_INTEGER <= n &&
n <= Number.MAX_SAFE_INTEGER);
}
网友评论