可能重复:
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
是用于表示规范中定义的八进制数的符号。符号8
和9
不存在于八进制编号中,因此parseInt
使用它找到的第一个有效数字,即0
。
如果你这样做…
parseInt('123@xq$_.f(--_!2*')
结果将是…
123
因为在字符串的开头找到了一个有效的数字。任何超出该范围的无效内容都将被丢弃。
您可以这样修复:
parseInt("080".replace(/^[0]+/g,""));