NaN!== parseInt(undefined);

时间:2014-09-07 19:02:02

标签: javascript numbers

这怎么可能是假的?

console.log(parseInt(undefined));
//NaN
console.log(parseInt(undefined)===NaN);
//false

看起来很蠢

3 个答案:

答案 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也是假的!