如何测试某个事物是否与NaN相同

How to test whether something is identically NaN?

本文关键字:是否 相同 NaN 何测试 测试      更新时间:2023-09-26

在Javascript中:

NaN === NaN; // false

我试图确定isNaN(foo)何时不仅仅等同于+foo"是"NaN。但我不知道如何判断某个东西是否是NaN,除非使用isNaN,它对许多事情都是肯定的,没有一个是===-NaN。

因此,我认为正确的方法是围绕其他可能性进行工作:

typeof NaN === 'number' // true

因此,我认为

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

最接近我的想法。这是有道理的,因为NaN将是唯一一个不是数字或其他什么的数字。这是正确的吗?这是最好的方法吗?

利用这一点:

foo !== foo

这相当于typeof foo === 'number' && isNaN(foo),也是Undercore.js用来检查NaN的确切值。

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

只要只在数值上使用isNaN方法,它就可以很好地工作。它为许多其他类型提供了非直观的结果,所以你不应该在数字之外的任何东西上使用它。

如果您可以使用ECMAScript 6,那么您就有了Object.is:

return Object.is(foo, NaN);

CCD_ 12确定两个值是否是相同的值。如果以下其中一项成立,则两个值相同:
[…]

  • 两个NaN

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

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;
    }
  };
}