NaN不按位排列:为什么ToInt32将NaN转换为零?

时间:2019-10-31 02:29:04

标签: javascript

我通常使用双按位NOT(~~)来代替Math.floor。最近,我发现与NaN一起使用时,它将返回0

console.log(~~NaN)

经过一番调查,我发现根据ECMAScript 2015 specs,按位不使用ToInt32内部...

  

oldValue 为ToInt32(GetValue( expr ))。

... by its turn

  

如果数字为NaN,+ 0,-0,+∞或-∞,则返回+0。

这说明了我的代码段~~NaN --> ~~0 --> ~-1 --> 0中的顺序。但是,对我来说,0对于NaN似乎是一个奇怪的选择。

我的问题:规范为什么选择0作为ToInt32(NaN)的返回值?可以说“因为NaN是虚假的” ,但+∞或-∞并非如此。我最好在寻找一些ECMA的书面说明(因此不会基于观点)。

1 个答案:

答案 0 :(得分:3)

NaN通常是一个浮点概念,而不是整数。 (与负零和无穷大相同。JavaScript编号是IEEE浮点数。)ToInt32仅产生从−2 ** 31到2 ** 31-1的整数,就像您期望在大多数情况下看到的是32位整数类型一样其他语言。