2012-03-15 80 views
3

可能重复:
Workarounds for JavaScript parseInt octal bug在JavaScript:为什么parseInt(“08”)评估为零,但parseInt(08)评估罚款?

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

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

+0

我的猜测是,parseInt函数需要一个字符串参数,如果你传递08(这是类型号),它首先将它转换为字符串,不领先的零。尝试在控制台中输入 - (08 +''),你会看到你得到“8”而不是“08”,这意味着它运行parseInt(“8”) - 这是一个十进制转换。 – yoavmatchulsky 2012-03-15 16:43:38

回答

12

这里的解决方案很简单。切勿拨打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()时,它无关紧要,因为该值已经是一个数字,因此它不会尝试对其进行更改。

5

“这是故意的行为吗?

是的。

“如果是这样,为什么?”

领先0是用于表示如在说明书中定义一个八进制数的表示法。符号89不以八进制编号存在,因此parseInt使用它找到的第一个有效号码,即0

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

parseInt('[email protected]$_.f(--_!2*') 

...结果会是...

123 

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

+0

我知道他们不存在八进制,但为什么一个字符串会解析为八进制parseInt(),当一个数字不是? – 2012-03-15 16:37:41

+0

字面数字08只是8 – 2012-03-15 16:39:14

0

可以这样解决这个问题:

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

我确实使用这种类型的hack {data.replace(/^0 + /,'')}来处理排序问题,但想知道为什么它会这样做。 – 2012-03-15 16:40:55

+3

为什么哦,你为什么要这样做,当你可以传递给parseInt的基数,它会为你做正确的事情? – jfriend00 2012-03-15 16:42:52

+0

对,我每天都在学习东西:-) – Alytrem 2012-03-15 16:45:03