目录
1. Number.EPSILON
2. 整数的安全范围(Number.MAX_SAFE_INTEGER、Number.MIN_SAFE_INTEGER)
3. 整数检测(Number.isInteger、Number.isSafeInteger)
4. 无穷数(Infinity)
5. 零值(+0 和 -0)
6. 特殊等式(Object.is)
计算机潜在的一个精度bug(比如0.1 + 0.2 = 0.30000000000000004)那怎么样来判断0.1 + 0.2 === 0.3?
最常见的方法是设置一个误差范围值,通常称为“机器精度”(machine epsilon),对 JavaScript 的数字来说,这个值通常是 2^-52 (2.220446049250313e-16) 。
ES6中有一个Number.EPSILON可供我们使用。为兼容ES6之前的版本需要加上:
if (!Number.EPSILON) {
Number.EPSILON = Math.pow(2,-52);
}
然后用这个误差值来进行判断:
function isEqual4Numbers(n1,n2) {
return Math.abs( n1 - n2 ) < Number.EPSILON;
}
var a = 0.1 + 0.2;
var b = 0.3;
isEqual4Numbers( a, b ); // true
isEqual4Numbers( 0.0000001, 0.0000002 ); // false
Number.MAX_SAFE_INTEGER = 9007199254740991
Number.MIN_SAFE_INTEGER = -9007199254740991
Number.isInteger用来检测值是否是整数,是ES6新增的方法。ES6之前的版本需要加上:
if (!Number.isInteger) {
Number.isInteger = function(num) {
return typeof num == 'number' && num % 1 == 0;
};
}
用法:
Number.isInteger( 520 ); // true
Number.isInteger( 520.000000 ); // true
Number.isInteger( 520.1314 ); // false
Number.isSafeInteger用来检测值是否是安全的整数,是ES6新增的方法。ES6之前的版本需要加上:
if (!Number.isSafeInteger) {
Number.isSafeInteger = function(num) {
return Number.isInteger( num ) &&
Math.abs( num ) <= Number.MAX_SAFE_INTEGER;
};
}
用法:
Number.isSafeInteger( Number.MAX_SAFE_INTEGER ); // true
Number.isSafeInteger( Math.pow( 2, 53 ) ); // false
Number.isSafeInteger( Math.pow( 2, 53 ) - 1 ); // true
var a = 1 / 0; // Infinity
var b = -1 / 0; // -Infinity
var a = 0 / -3; // -0
var b = 0 * -3; // -0
加法和减法运算不会得到负零(negative zero)。
负零在开发调试控制台中通常显示为 -0 ,但在一些老版本的浏览器中仍然会显示为 0 。
对负零进行字符串化会返回 "0" :
var a = 0 / -3;
a; // -0
a.toString(); // "0"
a + ""; // "0"
String( a ); // "0"
JSON.stringify( a ); // "0"
字符串转换为数字:
+"-0"; // -0
Number( "-0" ); // -0
JSON.parse( "-0" ); // -0
比较神奇的一个事情是JSON.stringify(-0) 返回 "0" ,而 JSON.parse("-0") 返回 -0 。
区分-0和0的方法:
function isNegZero(n) {
n = Number( n );
return (n === 0) && (1 / n === -Infinity);
}
isNegZero( -0 ); // true
isNegZero( 0 / -3 ); // true
isNegZero( 0 ); // false
Object.is是ES6新增的一个方法,ES6之前的版本需要加上:
if (!Object.is) {
Object.is = function(v1, v2) {
// 判断是否是-0
if (v1 === 0 && v2 === 0) {
return 1 / v1 === 1 / v2;
}
// 判断是否是NaN
if (v1 !== v1) {
return v2 !== v2;
}
// 其他情况
return v1 === v2;
};
}
用法:
var a = 2 / "foo";
var b = -3 * 0;
Object.is( a, NaN ); // true
Object.is( b, -0 ); // true
Object.is( b, 0 ); // false