使用 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:因為它們分別被轉換為 ""341,2true。通常, 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 時,採取以下步驟:

  1. 如果 Type(number) 不是 Number,則返回 false
  2. 如果數字是 NaN,請返回 true
  3. 否則,返回 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