可能重复:
Workarounds for JavaScript parseInt octal bug在JavaScript:为什么parseInt(“08”)评估为零,但parseInt(08)评估罚款?
我认为它是与八进制的解析,因为它只是发生在8或9还有人认为这是一个Chrome漏洞,但它也在Firefox中复制。
这是故意的行为吗?如果是这样,为什么?
可能重复:
Workarounds for JavaScript parseInt octal bug在JavaScript:为什么parseInt(“08”)评估为零,但parseInt(08)评估罚款?
我认为它是与八进制的解析,因为它只是发生在8或9还有人认为这是一个Chrome漏洞,但它也在Firefox中复制。
这是故意的行为吗?如果是这样,为什么?
这里的解决方案很简单。切勿拨打parseInt()
而不指定所需的基数。当您不传递第二个参数时,parseInt()
会尝试猜测基数是基于数字格式的。当它猜测时,它经常出错。
指定这样的基数,你会得到期望的结果:
parseInt("08", 10) == 8;
至于什么样的规则,它使用了猜测,您可以参考MDN doc page for parseInt()
。
如果基数是未定义的或0,JavaScript的假定:
- 如果输入字符串以 “0x” 或 “0X” 开头,基数是16 (十六进制)。
- 如果输入字符串以“0”开头,则基数为8 (八进制)。这个功能是非标准的,有些实现 故意不支持它(而是使用基数10)。 对于此 原因总是指定使用parseInt时的基数。
- 如果输入字符串 以任何其他值开头,则基数为10(十进制)。如果第一个 字符无法转换为数字,parseInt将返回NaN。
因此,根据这些规则,parseInt()
会猜测"08"
是八进制,但随后遇到未在八进制允许所以它返回0
一个数字。
当您将一个数字传递给parseInt()
时,它无关紧要,因为该值已经是一个数字,因此它不会尝试对其进行更改。
“这是故意的行为吗?
是的。
“如果是这样,为什么?”
领先0
是用于表示如在说明书中定义一个八进制数的表示法。符号8
和9
不以八进制编号存在,因此parseInt
使用它找到的第一个有效号码,即0
。
如果你这样做......
parseInt('[email protected]$_.f(--_!2*')
...结果会是...
123
...因为一个有效的数字是在字符串的开头找到。任何无效的东西都会被丢弃。
我知道他们不存在八进制,但为什么一个字符串会解析为八进制parseInt(),当一个数字不是? – 2012-03-15 16:37:41
字面数字08只是8 – 2012-03-15 16:39:14
我的猜测是,parseInt函数需要一个字符串参数,如果你传递08(这是类型号),它首先将它转换为字符串,不领先的零。尝试在控制台中输入 - (08 +''),你会看到你得到“8”而不是“08”,这意味着它运行parseInt(“8”) - 这是一个十进制转换。 – yoavmatchulsky 2012-03-15 16:43:38