我对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.感谢所有人的帮助。
答案 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.
。