JavaScript中的“值不相等”是什么意思?

JavaScript中的“值不相等”是什么意思?,javascript,Javascript,我在MDN文档中显示的polyfill中看到了这些代码片段: // Casts the value of the variable to a number. // So far I understand it ... count = +count; // ... and here my understanding ends. if (count != count) { count = 0; } 我不知道目的是什么 事物本身怎么可能不相等呢?在JavaScript中,NaN是唯

我在MDN文档中显示的polyfill中看到了这些代码片段:

 // Casts the value of the variable to a number.
 // So far I understand it ...
 count = +count;
 // ... and here my understanding ends.
 if (count != count) {
   count = 0;
 }
我不知道目的是什么


事物本身怎么可能不相等呢?

在JavaScript中,NaN是唯一不等于自身的值。这是对NaN的检查。

这是当计数为
NaN
时的测试,因为只有
NaN!=NaN

其他答案已经提到了为什么需要进行检查。但如果期望值是像
NaN
这样的错误值,则有另一种方法可以指定默认值

如果您有以下情况,则不需要if条件:

count = +count || 0; // so if count = NaN which is a falsy value then 0 will be assigned.

我将试着总结已经说过的话

if (count != count) {
检查
count
是否为
NaN
。根据报告:

ECMAScript代码测试值X是否为NaN的可靠方法是形式为X!==当且仅当X为NaN时,结果为真

(在这种情况下,这无关紧要,但polyfill使用
!=
而不是标准要求的
!=

您可能会问,为什么不使用
isNaN
?由于
isNaN
不符合其名称的含义-它不检查值是否为
NaN
,因此它会检查值在转换为数字时是否为
NaN
。例如,
“foo”
显然不是
NaN
,仍然
isNaN(“foo”)
将是
True
。相反,
isNaN([[1]])
False
,尽管
[[1]]]
不是有效数字

那么
count=+count | 0
呢?这是一个有效的快捷方式,但MDN polyfills会尽可能地遵循标准。报告说:

让n成为integer(count)

在哪里

设number为tonnumber(参数)

如果数字为NaN,则返回+0

请注意,它并没有说“callisnan”,而是说“if number is NaN”,找到答案的方法是将
number
与自身进行比较

另一个选项是,与全局
isNaN
不同,它不强制其参数
Number.isNaN(x)
当且仅当x实际上是一个NaN时才会返回true


因此,神秘的比较运算符
if(count!==count)
可以替换为
if(Number.isNaN(count))

非常好的解释,但我对此很好奇。用
isNaN()
方法检查它不是更好吗?那
{}呢{}
?@MarcspérezGude我认为,为了防止某些浏览器没有该功能。@Jai it首先将count转换为一个数字,这样它就不能是空对象。@DenizEng好吧,
窗口
确实不是一个数字,所以我认为没有问题。很好的快捷方式,但我认为OP首先对为什么会有这样的检查感兴趣。@JohnWhite事实上我在答案中有这样的检查,但因为这是别人发布的,所以我删除了它。
Number.isNaN("foo")  => false
Number.isNaN([[11]]) => false
Number.isNaN(0/0)    => true