在javascript中:为什么parseInt(“08”)的值为零,而parseInt(08)的值却很好

In javascript: why does parseInt("08") evaluate to zero, but parseInt(08) evaluate fine?

本文关键字:parseInt 很好 javascript 为什么      更新时间:2023-09-26

可能重复:
JavaScript parseInt八进制错误的解决方法

我认为这与八进制解析有关,因为它只发生在8或9上。也有人认为这是Chrome的一个bug,但它也在Firefox中复制。

这是故意的行为吗?如果是,为什么?

这里的解决方案很简单。在未指定所需基数的情况下,切勿调用parseInt()。当您不传递第二个参数时,parseInt()会尝试根据数字的格式来猜测基数是多少。当它进行猜测时,往往会出错。

指定这样的基数,你会得到想要的结果:

parseInt("08", 10) == 8;

至于它使用什么规则进行猜测,可以参考parseInt()的MDN文档页面。

如果基数未定义或为0,JavaScript将假定以下内容:

  • 如果输入字符串以"0x"或"0x"开头,则基数为16(十六进制)
  • 如果输入字符串以"0"开头,则基数为8(八进制)。此功能是非标准的,并且某些实现故意不支持它(而是使用基数10)为此reason在使用parseInt时总是指定基数
  • 如果输入字符串以任何其他值开头,基数为10(十进制)。如果第一个字符无法转换为数字,parseInt返回NaN

因此,根据这些规则,parseInt()将猜测"08"是八进制,但随后它遇到了一个八进制中不允许的数字,因此它返回0

当你把一个数字传递给parseInt()时,它没有任何作用,因为这个值已经是一个数字了,所以它不会试图改变它

"这是故意行为吗?"

是的。

"如果是,为什么?"

前导0是用于表示规范中定义的八进制数的符号。符号89不存在于八进制编号中,因此parseInt使用它找到的第一个有效数字,即0

如果你这样做…

parseInt('123@xq$_.f(--_!2*')

结果将是…

123

因为在字符串的开头找到了一个有效的数字。任何超出该范围的无效内容都将被丢弃。

您可以这样修复:

parseInt("080".replace(/^[0]+/g,""));