我认为它与八进制解析有关,因为它只发生在8或9上。还有人认为这是一个Chrome错误,但它也在Firefox中复制。
这是故意的行为吗?如果是这样,为什么?
答案 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
是用于表示规范中定义的八进制数的符号。八进制编号中不存在符号8
和9
,因此parseInt
使用它找到的第一个有效数字,即0
。
如果你这样做......
parseInt('123@xq$_.f(--_!2*')
......结果将是......
123
...因为在字符串的开头找到了有效的数字。任何无效的东西都会被丢弃。
答案 2 :(得分:0)
您可以这样解决:
parseInt("080".replace(/^[0]+/g,""));