使用 isNaN() 測試 NaN
window.isNaN()
全域性函式 isNaN()
可用於檢查某個值或表示式是否計算為 NaN
。此函式(簡而言之)首先檢查值是否為數字,如果沒有嘗試轉換它(*),然後檢查結果值是否為 NaN
。因此,這種測試方法可能會引起混淆。
(*)轉換方法並不那麼簡單,有關演算法的詳細說明,請參閱 ECMA-262 18.2.3 。
這些示例將幫助你更好地理解 isNaN()
行為:
isNaN(NaN); // true
isNaN(1); // false: 1 is a number
isNaN(-2e-4); // false: -2e-4 is a number (-0.0002) in scientific notation
isNaN(Infinity); // false: Infinity is a number
isNaN(true); // false: converted to 1, which is a number
isNaN(false); // false: converted to 0, which is a number
isNaN(null); // false: converted to 0, which is a number
isNaN(""); // false: converted to 0, which is a number
isNaN(" "); // false: converted to 0, which is a number
isNaN("45.3"); // false: string representing a number, converted to 45.3
isNaN("1.2e3"); // false: string representing a number, converted to 1.2e3
isNaN("Infinity"); // false: string representing a number, converted to Infinity
isNaN(new Date); // false: Date object, converted to milliseconds since epoch
isNaN("10$"); // true : conversion fails, the dollar sign is not a digit
isNaN("hello"); // true : conversion fails, no digits at all
isNaN(undefined); // true : converted to NaN
isNaN(); // true : converted to NaN (implicitly undefined)
isNaN(function(){}); // true : conversion fails
isNaN({}); // true : conversion fails
isNaN([1, 2]); // true : converted to "1, 2", which can't be converted to a number
最後一個有點棘手:檢查 Array
是否是 NaN
。為此,Number()
建構函式首先將陣列轉換為字串,然後轉換為數字; 這就是 isNaN([])
和 isNaN([34])
都返回 false
的原因,但是 isNaN([1, 2])
和 isNaN([true])
都返回了 true
:因為它們分別被轉換為 ""
,34
,1,2
和 true
。通常, isNaN()
將陣列視為 NaN
,除非它只儲存一個元素,其字串表示可以轉換為有效數字。
Version >= 6
Number.isNaN()
在 ECMAScript 6 中,Number.isNaN()
函式的實現主要是為了避免強制將引數轉換為數字的問題。實際上,Number.isNaN()
在測試之前不會嘗試將值轉換為數字。這也意味著只有數字型別的值,也就是 NaN
,返回 true
(這基本上只意味著 Number.isNaN(NaN)
)。
來自 ECMA-262 20.1.2.4 :
當用一個引數
number
呼叫Number.isNaN
時,採取以下步驟:
- 如果
Type(number)
不是 Number,則返回false
。- 如果數字是
NaN
,請返回true
。- 否則,返回
false
。
一些例子:
// The one and only
Number.isNaN(NaN); // true
// Numbers
Number.isNaN(1); // false
Number.isNaN(-2e-4); // false
Number.isNaN(Infinity); // false
// Values not of type number
Number.isNaN(true); // false
Number.isNaN(false); // false
Number.isNaN(null); // false
Number.isNaN(""); // false
Number.isNaN(" "); // false
Number.isNaN("45.3"); // false
Number.isNaN("1.2e3"); // false
Number.isNaN("Infinity"); // false
Number.isNaN(new Date); // false
Number.isNaN("10$"); // false
Number.isNaN("hello"); // false
Number.isNaN(undefined); // false
Number.isNaN(); // false
Number.isNaN(function(){}); // false
Number.isNaN({}); // false
Number.isNaN([]); // false
Number.isNaN([1]); // false
Number.isNaN([1, 2]); // false
Number.isNaN([true]); // false