这怎么可能是假的?
console.log(parseInt(undefined));
//NaN
console.log(parseInt(undefined)===NaN);
//false
看起来很蠢
答案 0 :(得分:8)
NaN 不等于任何东西,甚至本身。使用isNaN
检测NaN而不是相等。
NaN === NaN // -> false
isNaN(NaN) // -> true (argument is coerced [ToNumber] as required)
x = NaN
x !== x // -> true (would be false for any other value of x)
NaN || "Hi" // -> "Hi" (NaN is a false-y value, but not false)
这是遵循IEEE-754的JavaScript的结果,它是(安静的)NaN lack-of-ordering behavior:
与NaN的比较总是会返回无序的[不等于]结果,即使与自身进行比较也是如此。
另见What is the rationale for all comparisons returning false for IEEE754 NaN values?
答案 1 :(得分:3)
NaN不等于自己,原因可以从Stephen here发布的答案中理解:
我与卡汉谈话的理解是,NaN!= NaN起源于此 出于两个务实的考虑因素:
x == y
应尽可能等同于x - y == 0
(除了作为实数算术的定理之外,这使得硬件成为可能 实施比较更节省空间,这是最大的 标准制定时的重要性 - 但请注意, 这是违反了x = y =无穷大,所以这不是一个很好的理由 在其自己的;它可以合理地弯曲到x - y == 0 or NaN
)。更重要的是,当NaN在8087算术中形式化时,没有
isnan( )
谓词;有必要提供 程序员用方便有效的方法检测NaN 不依赖于编程语言提供某些东西的值 像isnan( )
这可能需要很多年。我会引用卡汉自己的话 写这个主题:如果没有办法摆脱NaNs,它们就像CRAYs上的Indefinites一样无用;一遇到一个,就算了 将是最好的停止,而不是无限期地继续 无限期的结论。这就是NaN必须进行的一些操作的原因 提供非NaN结果。哪个操作? ......例外是C. 谓词“x == x”和“x!= x”,分别为1和0 对于每个无限或有限数x但反过来,如果x不是数字 (NaN);这些提供了唯一简单的无与伦比的区别 在NaNs和缺少NaN和a的单词的语言中的数字之间 谓词IsNaN(x)。
请注意,这也是排除某些内容的逻辑 就像一个“不是布尔”。也许这种实用主义是错误的,并且 该标准应该要求
isnan( )
,但这样做 NaN几乎不可能有效且方便地使用几种 在世界等待编程语言采用的同时。我 不相信这会是一个合理的权衡。
答案 2 :(得分:2)
因为NaN === NaN也是假的!