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

Bry*_*gee 3 javascript parsing numbers

可能重复:
JavaScript parseInt八进制错误的变通方法

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

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

jfr*_*d00 12

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

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

parseInt("08", 10) == 8;
Run Code Online (Sandbox Code Playgroud)

至于它用于猜测的规则,您可以参考MDN文档页面parseInt().

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

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

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

当你传递一个数字时parseInt(),它无关,因为该值已经是一个数字,因此它不会尝试更改它.


小智 5

"这是故意的行为吗?"

是.

"如果是这样,为什么?"

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

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

parseInt('123@xq$_.f(--_!2*')
Run Code Online (Sandbox Code Playgroud)

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

123
Run Code Online (Sandbox Code Playgroud)

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