当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《(NaN!=NaN)和(NaN!==NaN)之间有什么区别?》经验,为你挑选了3个好方法。

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

x !== x

这将导致true当且仅当xNaN.

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

x != x

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



1> T.J. Crowder..:

首先,我要指出这NaN是一个非常特殊的价值:根据定义,它不等于自身.这来自JavaScript数字所依据的IEEE-754标准."非数字"值永远不会等于自身,即使这些位完全匹配也是如此.(它们不一定在IEEE-754中,它允许多个不同的"非数字"值.)这就是为什么会出现这种情况; JavaScript中的所有其他值都等于它们自己,NaN这很特别.

...我错过了JavaScript中的一些值,它将为x!== x返回true,而对于x!= x则返回false?

不你不是.!==和之间的唯一区别!=是,如果需要,后者将进行类型强制以使操作数的类型相同.在x != x,操作数的类型是相同的,因此它完全相同x !== x.

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

    ReturnIfAbrupt(X).

    ReturnIfAbrupt(Y).

    如果Type(x)与Type(y)相同,那么

    返回执行Strict Equality Comparison x === y的结果.

    ...

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

因此,如果弗拉纳根是正确的,只会NaN给予真实x !== x,我们可以肯定,只有这样NaN才会真实x != x.

许多JavaScript程序员默认使用===!==避免松散运算符所做的类型强制的一些陷阱,但在这种情况下,没有什么可以读到Flanagan对strict和loose运算符的使用.


我接受这个是因为这以正式和精确的方式回答了我的问题.谢谢你的解释!

2> jkdev..:

出于NaN的目的,!=!==做同样的事情.

但是,许多程序员避免使用JavaScript ==!=使用JavaScript.例如,道格拉斯·克罗克福德认为它们是JavaScript语言的" 坏部分 ",因为它们以令人意想不到的混乱方式表现:

JavaScript有两套相等运算符:===!==,邪恶的双胞胎==!=.好的工作方式与您期望的方式相同.

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


问题不在于NaN(尽管有标题).问题是*"我在JavaScript中遗漏了一些值,对于x!= x,将返回true,而对于x!= x,则返回false?"*

3> GOTO 0..:

只是为了好玩,让我告诉你一个人为的例子,其中xNaN但运营商不同的表现呢.首先定义:

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

然后我们有

x != x // false

x !== x // true


哈!:-)但这实际上是`foo()!= foo()`其中foo返回1然后2.例如,*values*不一样,它只是比较不同的值.
推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有