《你不知道的JavaScript(中卷)》读后笔记 —— JavaScript中“Number”的冷门知识点

目录

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)


1. Number.EPSILON

计算机潜在的一个精度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

2. 整数的安全范围(Number.MAX_SAFE_INTEGER、Number.MIN_SAFE_INTEGER)

Number.MAX_SAFE_INTEGER = 9007199254740991

Number.MIN_SAFE_INTEGER = -9007199254740991

 

3. 整数检测(Number.isInteger、Number.isSafeInteger)

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

 

4. 无穷数(Infinity)

var a = 1 / 0; // Infinity
var b = -1 / 0; // -Infinity

 

5. 零值(+0 和 -0)

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

6. 特殊等式(Object.is)

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

 

你可能感兴趣的:(前端开发)