4

在 Javascript 中:

NaN === NaN; // false

我试图确定 whenisNaN(foo)不只是等同于+foo"is" NaN。但我不知道如何判断某事是否是NaN除了使用isNaN,它对很多事情都说是,没有一个是===NaN。

所以我认为正确的方法是解决其他可能性:

typeof NaN === 'number' // true

因此我认为

typeof(foo) === 'number' && isNaN(foo)

是最接近我所想的。这是有道理的,因为它NaN是唯一不是数字或其他东西的数字。这是正确的,这是最好的方法吗?

4

3 回答 3

7

利用它来发挥你的优势:

foo !== foo

这等价于typeof foo === 'number' && isNaN(foo)也是Underscore.js 用来准确检查的内容NaN

于 2013-06-25T22:59:50.160 回答
3

NaN 不等于自身的原因是两个计算可以由于不同的原因变成 NaN。如果您进行两次计算并比较结果,如果其中一个值为 NaN 或两者均为 NaN,则您不希望它们相等。

isNaN只要您仅在数值上使用该方法,该方法就可以正常工作。它为许多其他类型提供了不直观的结果,因此您根本不应该将它用于除数字以外的任何东西。

于 2013-06-25T23:06:33.803 回答
1

如果你可以使用ECMAScript 6,你有Object.is

return Object.is(foo, NaN);

Object.is()确定两个值是否相同。如果满足以下条件之一,则两个值相同:
[...]

  • 两个都NaN

如果未定义,MDN 还建议使用Polyfill (使用相同的技巧):Object.isfoo!==foo

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;
    }
  };
}
于 2015-06-02T12:26:56.333 回答