首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(NaN != NaN)和(NaN !== NaN)有什么区别?

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

Stack Overflow用户
提问于 2015-12-14 07:44:13
回答 5查看 14.6K关注 0票数 151

首先,我想提到,我知道isNaN()Number.isNaN()是如何工作的。我正在阅读David Flanagan的“明确指南”,他给出了一个如何检查值是否为NaN的示例。

代码语言:javascript
复制
x !== x

这将导致true当且仅当xNaN

但现在我有一个问题:为什么他要用严格的比较?因为看起来

代码语言:javascript
复制
x != x

行为也是一样的。使用这两个版本是否安全,还是在JavaScript中缺少一些将返回true for x !== xfalse for x != x的值?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-12-14 09:09:33

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

...am i在JavaScript中缺少一些值,对于x !== x返回true,对于x != x返回false?

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

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

  1. ReturnIfAbrupt(x).
  2. ReturnIfAbrupt(y).
  3. 如果类型(X)与类型(Y)相同,那么 返回执行严格等式比较x === y的结果。
  4. ..。

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

因此,如果弗拉纳根是正确的,只有NaN才能给出x !== x的真,那么我们可以肯定的是,只有NaN才能给出x != x的真。

许多JavaScript程序员默认使用===!==来避免松散操作符所做的类型强制所带来的一些缺陷,但是在这种情况下,没有什么可以理解弗拉纳根对严格操作符和松散操作符的使用。

票数 128
EN

Stack Overflow用户

发布于 2015-12-14 08:21:00

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

然而,许多程序员避免在==!=中使用JavaScript。例如,Douglas认为它们是JavaScript语言的"坏零件“之一,因为它们的行为方式出人意料且令人困惑:

JavaScript有两组等式运算符:===!==,以及它们的邪恶双胞胎==!=。好的按你预期的方式工作。 ...My的建议是永远不要使用邪恶的双胞胎。相反,始终使用===!==

票数 38
EN

Stack Overflow用户

发布于 2015-12-14 09:59:54

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

代码语言:javascript
复制
Object.defineProperty(
  self,
  'x',
  { get: function() { return self.y = self.y ? 0 : '0'; } }
);

然后我们就有了

代码语言:javascript
复制
x != x // false

代码语言:javascript
复制
x !== x // true
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34261938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档