如何测试某些东西是否与NaN相同?

时间:2013-06-25 22:56:11

标签: javascript nan

在Javascript中:

NaN === NaN; // false

我试图确定isNaN(foo)何时不等于+foo“是”NaN。但是我不知道如何判断某些内容是NaN,除非使用isNaN,其中许多内容都是肯定的,其中没有=== NaN。

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

typeof NaN === 'number' // true

因此我认为

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

最接近我的想法。这是有道理的,因为NaN是唯一不是数字或其他内容的数字是有意义的。这是正确的,这是最好的方法吗?

3 个答案:

答案 0 :(得分:7)

使用它对您有利:

foo !== foo

这相当于typeof foo === 'number' && isNaN(foo)is what Underscore.js uses to check for exactly NaN, too

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

如果您可以使用ECMAScript 6,则可以使用Object.is

return Object.is(foo, NaN);
  

Object.is()确定两个值是否相同。如果下列之一成立,则两个值相同:
  [...]

     
      
  • NaN
  •   

MDN还建议Polyfill如果未定义Object.is(使用相同的foo!==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;
    }
  };
}