6

根据Mozilla 文档

在数值上下文中使用时,未定义的值会转换为 NaN。

那么为什么以下两个都等于真的呢?:

NaN != undefined
NaN !== undefined

我可以理解Nan !== undefined为变量类型会有所不同......

4

2 回答 2

13

NaN根据定义是“不是数字

这并不意味着它是未定义的——它明确定义的——而是在某种意义上它不是一个数字的未定义。

于 2013-04-19T13:59:09.740 回答
2

这是因为,根据ECMAScript 语言规范的第 4.3.23 节 NaN定义为:

数字值,它是 IEEE 754“非数字”值

所以它是一个数字,而不是未定义或空值。该值在第 8.3 节中进一步解释

...; 对于 ECMAScript 代码,所有 NaN 值彼此无法区分。

第 11.9.3 节NaN定义了与 的相等比较:

比较 x == y,其中 x 和 y 是值,产生真或假。这样的比较执行如下: 如果 Type(x) 是 Number,那么:

如果 x 是 NaN,则返回 false。

如果 y 是 NaN,则返回 false。

为了进行比较,您应该isNaN()改用:

isNaN(NaN)
// true

更新

的值+undefined不是数字,但它仍然是一个数字(尽管具有特殊值),因此不是未定义的。就像转换undefined为字符串如何产生一个已定义的字符串值一样。

于 2013-04-19T13:59:18.727 回答