全域性物件的 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