全局对象的 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