(NaN!= NaN)和(NaN!== NaN)之间有什么区别?

首先我想提一下,我知道isNaN()Number.isNaN()是如何工作的。 我正在阅读David Flanagan的The Definite Guide,他给出了一个如何检查该值是否为NaN的例子:

x !== x

当且仅当xNaN这才会true

但是现在我有一个问题:为什么他使用严格的比较? 因为它似乎

x != x

表现方式相同。 使用这两个版本是否安全?或者我在JavaScript中缺少一些值,它将返回x !== x false true ,并且x != x false


首先,让我指出NaN是一个非常特殊的价值:根据定义,它不等于它自己。 这来自JavaScript数字所依据的IEEE-754标准。 即使这些比特完全匹配,“不是数字”值也不会与自身相等。 (它们不一定在IEEE-754中,它允许多个不同的“不是数字”值)。这就是为什么这会出现; JavaScript中的所有其他值都等于它们自己, NaN只是特殊的。

...我错过了JavaScript中的一些值,它将为x!== x返回true,在x!= x时为false?

不你不是。 !==!=之间的唯一区别是后者会根据需要进行类型强制,以使操作数的类型相同。 在x != x ,操作数的类型是相同的,所以它与x !== x完全一样。

从抽象平等操作的定义开始就很清楚:

  • ReturnIfAbrupt(X)。
  • ReturnIfAbrupt(Y)。
  • 如果类型(x)与类型(y)相同,则

    返回执行严格平等比较x === y的结果。

  • ...

  • 前两个步骤是基本管道。 所以实际上, ==第一步是查看类型是否相同,如果是这样,则执行===!=!==只是否定版本。

    所以如果弗拉纳根是正确的,只有NaN会给x !== x赋予正确的结果,我们可以肯定的是,只有NaN才会对x != x赋予正确性。

    许多JavaScript程序员默认使用===!==来避免松散运算符在类型强制时出现的一些问题,但在这种情况下,Flanagan没有使用严格运算符或松散运算符。


    为了NaN的目的, !=!==做同样的事情。

    但是,很多程序员在JavaScript中避免使用==!= 。 例如,道格拉斯克罗克福德认为它们是JavaScript语言的“不好的部分”,因为它们表现出意想不到的混乱方式:

    JavaScript有两套相等运算符: ===!== ,以及它们的邪恶双胞胎==!= 。 好的那些以你期望的方式工作。

    ...我的建议是永远不要使用邪恶的双胞胎。 相反,总是使用===!==


    为了好玩,让我给你展示一个人为的例子,其中x不是NaN但是操作员的行为不同。 首先定义:

    Object.defineProperty(
      self,
      'x',
      { get: function() { return self.y = self.y ? 0 : '0'; } }
    );
    

    然后我们有

    x != x // false
    

    x !== x // true
    
    链接地址: http://www.djcxy.com/p/58499.html

    上一篇: What is the difference between (NaN != NaN) and (NaN !== NaN)?

    下一篇: How to check if any value is NaN in a Pandas DataFrame