全域性物件的 NaN 屬性
NaN
(“ N ot a N umber”)是由 IEEE 浮點運算標準 定義的特殊值,當提供非數字值但預期數字(1 * "two"
)時,或者當計算沒有時使用沒有有效的 number
結果(Math.sqrt(-1)
)。
與 NaN
的任何相等或相關比較都會返回 false
,甚至將其與自身進行比較。因為,NaN
應該表示無意義計算的結果,因此,它不等於任何其他無意義計算的結果。
(1 * "two") === NaN //false
NaN === 0; // false
NaN === NaN; // false
Number.NaN === NaN; // false
NaN < 0; // false
NaN > 0; // false
NaN > 0; // false
NaN >= NaN; // false
NaN >= 'two'; // false
非相等比較將始終返回 true
:
NaN !== 0; // true
NaN !== NaN; // true
檢查值是否為 NaN
Version >= 6
你可以使用函式 Number.isNaN()
測試 NaN
的值或表示式 :
Number.isNaN(NaN); // true
Number.isNaN(0 / 0); // true
Number.isNaN('str' - 12); // true
Number.isNaN(24); // false
Number.isNaN('24'); // false
Number.isNaN(1 / 0); // false
Number.isNaN(Infinity); // false
Number.isNaN('str'); // false
Number.isNaN(undefined); // false
Number.isNaN({}); // false
Version < 6
你可以通過與自身進行比較來檢查值是否為 NaN
:
value !== value; // true for NaN, false for any other value
你可以將以下 polyfill 用於 Number.isNaN()
:
Number.isNaN = Number.isNaN || function(value) {
return value !== value;
}
相比之下,全域性函式 isNaN()
不僅為 NaN
返回 true
,而且還為任何不能強制轉換為數字的值或表示式返回 true
:
isNaN(NaN); // true
isNaN(0 / 0); // true
isNaN('str' - 12); // true
isNaN(24); // false
isNaN('24'); // false
isNaN(Infinity); // false
isNaN('str'); // true
isNaN(undefined); // true
isNaN({}); // true
ECMAScript 定義了一個名為 SameValue
的相同演算法,因為 ECMAScript 6 可以用 Object.is
呼叫。與 ==
和 ===
的比較不同,使用 Object.is()
會將 NaN
視為與自身相同(而 -0
與+0
不同):
Object.is(NaN, NaN) // true
Object.is(+0, 0) // false
NaN === NaN // false
+0 === 0 // true
Version < 6
你可以將以下 polyfill 用於 Object.is()
(來自 MDN ):
if (!Object.is) {
Object.is = function(x, y) {
// SameValue algorithm
if (x === y) { // Steps 1-5, 7-10
// Steps 6.b-6.e: +0 != -0
return x !== 0 || 1 / x === 1 / y;
} else {
// Step 6.a: NaN == NaN
return x !== x && y !== y;
}
};
}
注意事項
NaN 本身是一個數字,意味著它不等於字串 NaN
,最重要的是(雖然可能不直觀):
typeof(NaN) === "number"; //true