『あなたの知らないJavaScript(中巻)』読後ノート——JavaScriptの「Number」の冷門知識点

3316 ワード

目次
1. Number.EPSILON
2. 整数の安全範囲(Number.MAX_INTEGER、Number.MINSAFE_INTEGER)
3. 整数検出(Number.isInteger、Number.isSafe Integer)
4. 無限数(Infinity)
5. ゼロ(+0と-0)
6. 特殊式(Object.is)
1. Number.EPSILON
コンピュータの潜在的な1つの精度のbug(たとえば0.1+0.2=0.30億00004)はどのように0.1+0.2===0.3を判断しますか?
最も一般的な方法は誤差範囲値を設定することであり、通常は「マシン精度」(machine epsilon)と呼ばれ、JavaScriptの数字にとって、この値は通常2^-52(2.22044604925033 e-116)である.
ES 6にはNumber.EPSILONがあります.私たちが使うことができます.ES 6に対応する前のバージョンのために追加する必要があります.
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_INTEGER、Number.MINSAFE_INTEGER)
Number.MAX_SAFE_INTEGER = 9007199254740991

Number.MIN_SAFE_INTEGER = -9007199254740991
 
3. 整数検出(Number.isInteger、Number.isSafe Integer)
Number.isIntegerは、値が整数かどうかを検出するために、ES 6が追加される方法です.ES 6の前のバージョンは追加が必要です.
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が安全な整数かどうかを検出するのは、ES 6が追加した方法です.ES 6の前のバージョンは追加が必要です.
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
足し算と減算はマイナスゼロにはなりません.負のゼロは開発デバッグコンソールでは通常-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.strigify(-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はES 6に追加された方法であり、ES 6の前のバージョンは下記の通りである.
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