我对某一特定结果感到困惑parseInt.我以为我理解了它的大部分怪癖,但这一点还不清楚.
parseInt("010", 10); // 10
parseInt(010, 10); // 8, but expecting 10
Run Code Online (Sandbox Code Playgroud)
在第二个例子中,我指定了正确的基数.出乎意料的结果是什么原因?
解
问题在于八进制文字.当一个数字前置为0时,它被视为八进制文字.
如果你执行
console(010); // 8
Run Code Online (Sandbox Code Playgroud)
在非脚本模式下,你会得到8. parseInt拥有我认为奇怪的行为的原因是因为我基本上是在执行
parseInt(8, 10); // 8
Run Code Online (Sandbox Code Playgroud)
并期待10.
ParseInt从未见过010,只有8.感谢所有人的帮助.
该号码在传递之前正在被解析parseInt.
例如,它与其工作方式类似:
var x = 010;
console.log(x); // 8
parseInt(x, 10);
Run Code Online (Sandbox Code Playgroud)
因为你传球8,当然你将获得8回.在0之前添加一个数字将使它成为八进制文字,使用8的基数.你可以删除前导0(首先是前导0并不是真的有意义),或者(如你所做的那样)在你的问题中)将其作为字符串传递.
请注意,并非所有浏览器都这样做,它只是与执行此操作的先前代码兼容的(它不是必需的),并且实现不能在ES5严格模式下解析八进制文字.要查看此效果,请比较非严格版本:
(function ()
{ // not strict
parseInt(010, 10);
})();
Run Code Online (Sandbox Code Playgroud)
...返回8或10(取决于实现),严格版本:
(function ()
{ "use strict";
parseInt(010, 10);
})();
Run Code Online (Sandbox Code Playgroud)
这将导致a SyntaxError: Octal literals are not allowed in strict mode..
| 归档时间: |
|
| 查看次数: |
1410 次 |
| 最近记录: |