首先,我要提一提,我知道如何isNaN()
和Number.isNaN()
工作.我正在阅读David Flanagan的The Definite Guide,他给出了一个如何检查值是否为例子的例子NaN
:
x !== x
这将导致true
当且仅当x
是NaN
.
但现在我有一个问题:他为什么要使用严格的比较?因为它似乎
x != x
表现方式相同.是否可以安全使用的两个版本,或我很想念在JavaScript中的一些值(S),将返回true
的x !== x
和false
为x != x
?
首先,我要指出这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运算符的使用.
出于NaN的目的,!=
并!==
做同样的事情.
但是,许多程序员避免使用JavaScript ==
或!=
使用JavaScript.例如,道格拉斯·克罗克福德认为它们是JavaScript语言的" 坏部分 ",因为它们以令人意想不到的混乱方式表现:
JavaScript有两套相等运算符:
===
和!==
,邪恶的双胞胎==
和!=
.好的工作方式与您期望的方式相同.......我的建议是永远不要使用邪恶的双胞胎.相反,总是使用
===
和!==
.
只是为了好玩,让我告诉你一个人为的例子,其中x
不NaN
但运营商不同的表现呢.首先定义:
Object.defineProperty( self, 'x', { get: function() { return self.y = self.y ? 0 : '0'; } } );
然后我们有
x != x // false
但
x !== x // true