如何测试某个值是否为NaN?

4

在Javascript中:

NaN === NaN; // false

我正在尝试确定isNaN(foo)何时不仅等同于+foo“是”NaN。但我不知道如何判断某个东西是否为NaN,除非使用isNaN,它对许多东西都是肯定的,其中没有一个=== NaN
因此,我认为正确的方法应该是解决其他可能性:
typeof NaN === 'number' // true

因此,我认为
typeof(foo) === 'number' && isNaN(foo)

这个描述是最贴近我想法的。因为NaN是唯一不是数字的数字,所以这个解释是有意义的。这个解释正确吗?这是最好的方式吗?


2
这个链接对你会有帮助 - https://dev59.com/uGLVa4cB1Zd3GeqPxInu - dsgriffin
1
没错,我已经投票重新打开旧的帖子了,但有时这些事情可能需要一段时间。 - dsgriffin
我将它作为这个问题的重复关闭,因为这个更加详细。如果有人修复了另一个问题(因为楼主似乎早已离开),他们可以随意切换 =) - Ry-
@minitech,权限没问题,谢谢。离重复标记还差3票... - djechlin
3个回答

7

没错,我读了很多次NaN是唯一一个不等于自己的值。 - djechlin
两边都有相同的值,那么进行比较有什么意义? - Imad Alazani

3

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

只要您仅在数字值上使用isNaN方法,它就可以正常工作。对于许多其他类型,它会给出令人费解的结果,因此您不应将其用于除数字以外的任何内容。


这个回答是否解决了问题呢?(代码明确表示“如果这是一个数值”,例如) - Ry-
@minitech:是的,在我回答这个问题之后添加了这部分内容,而这个答案证实了 isNaN 的结果只对数值有意义。 - Guffa

2
如果您能使用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;
    }
  };
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接