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

2020/11/12 09:22 · javascript ·  · 0评论

首先,我要提一提,我知道如何isNaN()Number.isNaN()工作。我正在阅读David Flanagan的《明确指南》,他举了一个示例说明如何检查该值是否为NaN

x !== x

这将在true且仅当x为时产生NaN

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

x != x

行为相同。是否可以安全使用的两个版本,或我很想念在JavaScript中的一些值(S),将返回truex !== xfalsex != x

首先,让我指出这NaN是一个非常特殊的值:根据定义,它不等于自身。这来自使用JavaScript数字的IEEE-754标准。即使这些位完全匹配,“非数字”值也永远不会等于自身。(虽然它们不一定在IEEE-754中,但它允许多个不同的“非数字”值。)这就是为什么出现这种情况的原因。JavaScript中的所有其他值都等于自己,NaN只是很特殊。

...我缺少JavaScript中的某些值,该值将对x!== x返回true,对于x!= x返回false?

不你不是。!==之间的唯一区别!=是,如果有必要使操作数的类型相同,后者将进行类型强制转换。在中x != x,操作数的类型相同,因此与完全相同x !== x

抽象平等操作的定义开始就可以清楚地看出这一点

  1. ReturnIfAbrupt(x)。
  2. ReturnIfAbrupt(y)。
  3. 如果Type(x)与Type(y)相同,则

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

  4. ...

前两个步骤是基本的管道。因此,实际上,第一步==是查看类型是否相同,如果相同,则===改为进行更改!=!==只是否定的那个版本。

因此,如果弗拉纳根(Flanagan)是正确的,那只NaN会为真。因此x !== x,我们可以肯定,也只会NaN为真x != x

许多JavaScript程序员都默认使用===,并!==避免周围的类型强制宽松的运营商做一些缺陷,但没有什么读入弗拉纳根在这种情况下使用的严格与宽松的经营者。

楠的目的,!=!==做同样的事情。

但是,许多程序员避免使用JavaScript==!=使用JavaScript。例如,道格拉斯·克罗克福德(Douglas Crockford)认为它们是JavaScript语言的“坏部分”,因为它们的行为方式令人意想不到且令人困惑:

JavaScript有两组相等运算符:===!==,以及它们的邪恶孪生子==!=优秀的产品以您期望的方式工作。

...我的建议是不要使用邪恶的双胞胎。相反,请始终使用===!==

只是为了好玩,让我向您展示一个人工的示例,该示例x不是,NaN但操作员的行为无论如何都不同。首先定义:

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

那我们有

x != x // false

x !== x // true

我只想指出,NaN不是x !== x不使用全局对象而产生的唯一东西有很多聪明的方法来触发此行为。这是使用吸气剂的一种:

var i = 0, obj = { get x() { return i++; }};
with(obj) // force dynamic context, this is evil. 
console.log(x === x); // false

正如其他答案所指出的那样,==执行类型强制转换,但与其他语言一样,并以标准来表示-NaN表示计算失败,并且由于充分的原因不等于其本身。

出于某些原因,人们认为这是JS的问题,但是大多数双精度语言(即C,Java,C ++,C#,Python等)都表现出这种精确的行为,人们对此表示满意。

有时,图像比文字要好,请检查此(这是我之所以将其作为答案而不是评论的原因,因为它具有更好的可见性)。

在那里,您可以看到严格相等比较(===)仅在类型和内容匹配时返回true,因此

var f = "-1" === -1; //false

虽然抽象相等比较(==)通过转换类型然后严格比较它们仅检查内容*:

var t = "-1" == -1; //true

尽管目前尚不清楚,但是如果不咨询ECMA,JavaScript在比较时会考虑什么,这种方式将使代码评估为true。

 var howAmISupposedToKnowThat = [] == false; //true
本文地址:http://javascript.askforanswer.com/nan-nanhenan-nanyoushenmequbie.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!