在javascript中:为什么parseInt(“08”)评估为零,但是parseInt(08)评估为好?

时间:2012-03-15 16:34:10

标签: javascript parsing numbers

  

可能重复:
  Workarounds for JavaScript parseInt octal bug

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

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

3 个答案:

答案 0 :(得分:12)

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

像这样指定基数,您将得到所需的结果:

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

关于它用于猜测的规则,您可以参考MDN doc page for parseInt()

  

如果radix未定义或为0,则JavaScript假定以下内容:

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

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

当您将数字传递给parseInt()时,它无关,因为该值已经是一个数字,所以它不会尝试更改它。

答案 1 :(得分:5)

  

“这是故意的行为吗?”

是。

  

“若然,为什么?”

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

如果你这样做......

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

......结果将是......

123

...因为在字符串的开头找到了有效的数字。任何无效的东西都会被丢弃。

答案 2 :(得分:0)

您可以这样解决:

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