parseInt(“010”,10);与parseInt(010,10);

时间:2013-11-17 03:51:13

标签: javascript

我对parseInt的特定结果感到困惑。我以为我理解了它的大部分怪癖,但这一点还不清楚。

parseInt("010", 10); // 10

parseInt(010, 10);   // 8, but expecting 10

在第二个例子中,我指定了正确的基数。出现意外结果的原因是什么?

解决方案

问题在于八进制文字。当一个数字前置为0时,它被视为八进制文字。

如果你执行

console(010); // 8

在非脚本模式下,你会得到8. parseInt拥有我认为奇怪的行为的原因是因为我本质上是在执行

parseInt(8, 10); // 8

并期待10。

ParseInt从未见过010,只有8.感谢所有人的帮助。

2 个答案:

答案 0 :(得分:9)

以零开头的数字文字位于octal,而不是decimal,因此010等于8,除非在strict mode下操作。

请务必注意parseInt的行为会因浏览器使用的ECMAScript(JavaScript)版本或操作严格模式而异​​。有关详细信息,请参阅Octal Interpretations with No Radix

答案 1 :(得分:8)

在传递给parseInt之前,正在解析该号码。

例如,它与其工作方式类似:

var x = 010;
console.log(x); // 8
parseInt(x, 10); 

因为你已经过了8分,当然你将获得8分。在0之前添加一个数字将使它成为八进制文字,使用8的基数。你可以删除前导0(首先是前导0并不是真的有意义),或者(如你所做的那样)在你的问题中)把它作为一个字符串传递。

请注意,并非所有浏览器都这样做,它只是与以前执行此操作的代码(不是必需的)兼容的,以及implementations must not parse octal literals in ES5 strict mode。要查看此效果,请比较非严格版本:

(function ()
{   // not strict
    parseInt(010, 10);
})();

...返回8或10(取决于实现),严格版本:

(function ()
{   "use strict";
    parseInt(010, 10);
})();

这将产生SyntaxError: Octal literals are not allowed in strict mode.