首先,我想提到,我知道isNaN()和Number.isNaN()是如何工作的。我正在阅读David Flanagan的“明确指南”,他给出了一个如何检查值是否为NaN的示例。
x !== x这将导致true当且仅当x是NaN。
但现在我有一个问题:为什么他要用严格的比较?因为看起来
x != x行为也是一样的。使用这两个版本是否安全,还是在JavaScript中缺少一些将返回true for x !== x和false for x != x的值?
发布于 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完全相同。
从抽象平等运作定义的一开始就可以清楚地看到这一点
前两个步骤是基本的管道。因此,实际上,==的第一步就是查看类型是否相同,如果是,则执行===。!=和!==只是否定的版本。
因此,如果弗拉纳根是正确的,只有NaN才能给出x !== x的真,那么我们可以肯定的是,只有NaN才能给出x != x的真。
许多JavaScript程序员默认使用===和!==来避免松散操作符所做的类型强制所带来的一些缺陷,但是在这种情况下,没有什么可以理解弗拉纳根对严格操作符和松散操作符的使用。
发布于 2015-12-14 08:21:00
为了NaN的目的,!=和!==也做同样的事情。
然而,许多程序员避免在==或!=中使用JavaScript。例如,Douglas认为它们是JavaScript语言的"坏零件“之一,因为它们的行为方式出人意料且令人困惑:
JavaScript有两组等式运算符:
===和!==,以及它们的邪恶双胞胎==和!=。好的按你预期的方式工作。 ...My的建议是永远不要使用邪恶的双胞胎。相反,始终使用===和!==。
发布于 2015-12-14 09:59:54
为了好玩,让我向您展示一个人工的例子,其中x不是NaN,但是操作符的行为无论如何都不同。首先定义:
Object.defineProperty(
self,
'x',
{ get: function() { return self.y = self.y ? 0 : '0'; } }
);然后我们就有了
x != x // false但
x !== x // truehttps://stackoverflow.com/questions/34261938
复制相似问题