Javascript 按位不带NaN:为什么ToInt32将NaN转换为零?

Javascript 按位不带NaN:为什么ToInt32将NaN转换为零?,javascript,Javascript,我通常使用双位NOT(~)作为Math.floor的替代。最近我发现,当与NaN一起使用时,它将返回0: console.log(~~NaN)NaN通常是浮点概念,而不是整数概念。(与负零和无穷大相同。JavaScript数字是IEEE浮点数。)ToInt32只从−2**31至2**31−1,就像您在大多数其他语言中看到的32位整数类型一样。因为位运算符只处理整数,而NaN是一个浮点。ECMA-262告诉您需要知道的一切:“对Int32的抽象操作将参数转换为2^32整数值中的一个…”,所以它必

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


console.log(~~NaN)
NaN通常是浮点概念,而不是整数概念。(与负零和无穷大相同。JavaScript数字是IEEE浮点数。)ToInt32只从−2**31至2**31−1,就像您在大多数其他语言中看到的32位整数类型一样。

因为位运算符只处理整数,而NaN是一个浮点。ECMA-262告诉您需要知道的一切:“对Int32的抽象操作将参数转换为2^32整数值中的一个…”,所以它必须生成一个整数。即使参数不是数字(因此
ToNumber(argument)
产生NaN),它也会返回0。这是问为什么的错误地方,最好试试TC39邮件列表或“然而,对我来说,
0
对于
NaN
”似乎是一个奇怪的选择。“还有什么其他值不那么奇怪-1? +1? -2**31或+2**31-1?一切似乎都相当武断。没有比0更明智的选择了。“负零和无限”将是一个伟大的乐队名称。