【问题标题】:How to test whether something is identically NaN?如何测试某物是否相同 NaN?
【发布时间】:2013-06-22 22:25:05
【问题描述】:

在 Javascript 中:

NaN === NaN; // false

我试图确定isNaN(foo) 何时不仅仅等同于+foo“是”NaN。但我不知道如何判断某事是否为NaN,除非使用isNaN,它对很多事情都说是,其中没有=== NaN。

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

typeof NaN === 'number' // true

所以我认为

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

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

【问题讨论】:

  • 是的。我已经投票决定暂时重新打开旧的,但有时这些事情可能需要一段时间......
  • @djechlin:我把它作为这个的副本关闭了,因为这个信息更丰富,是的。如果有人修复了另一个(因为 OP 似乎早已不复存在),如果他们喜欢,可以切换它=)
  • @minitech 对,模组能力,谢谢。离骗局差 3 票...

标签: javascript nan


【解决方案1】:

利用它来发挥你的优势:

foo !== foo

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

【讨论】:

  • 哦,对了,我多次读到NaN 是唯一不等于自身的值。
  • 双方,foo 将具有相同的值。那么比较有什么意义呢?
【解决方案2】:

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

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

【讨论】:

  • 这是否回答了这个问题? (代码特别说明“如果这是一个数值”,例如)
  • @minitech:是的,这部分问题是我回答后才添加的,这个答案证实了isNaN的结果只对数值有意义。
【解决方案3】:

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

return Object.is(foo, NaN);

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

  • NaN

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    相关资源
    最近更新 更多