如何解决 JavaScript 的 parseInt 八进制行为?

问题描述 投票:0回答:10

尝试在 JavaScript 中执行以下代码:

parseInt('01'); //equals 1
parseInt('02'); //equals 2
parseInt('03'); //equals 3
parseInt('04'); //equals 4
parseInt('05'); //equals 5
parseInt('06'); //equals 6
parseInt('07'); //equals 7
parseInt('08'); //equals 0 !!
parseInt('09'); //equals 0 !!

我刚刚经历了惨痛的教训,JavaScript 认为前导零表示一个 八进制整数,并且由于基数 8 中没有

"8"
"9"
,因此该函数返回零。不管你喜不喜欢,这是设计使然的

解决方法有哪些?

注意:为了完整起见,我即将发布一个解决方案,但这是我讨厌的解决方案,所以请发布其他/更好的答案。


更新:

JavaScript 标准第五版 (ECMA-262) 引入了一项重大更改,消除了这种行为。 Mozilla 有一篇很好的文章

javascript integer octal
10个回答
333
投票

这是一个常见的 Javascript 问题,有一个简单的解决方案:

只需指定基数,或“基数”,如下所示:

parseInt('08',10); // 8

您也可以使用数字:

Number('08'); // 8

44
投票

如果您知道您的值将在有符号的32位整数范围内,那么

~~x
将在所有情况下执行正确的操作。

~~"08" === 8
~~"foobar" === 0
~~(1.99) === 1
~~(-1.99)  === -1

如果您查找二进制 not (

~
),则规范要求对参数进行“ToInt32”转换,该转换会明显转换为 Int32,并指定将
NaN
值强制为零。

是的,这确实很黑客,但很方便......


24
投票

parseInt 文档,使用可选的基数参数来指定以 10 为基数:

parseInt('08', 10); //equals 8
parseInt('09', 10); //equals 9

这让我觉得迂腐、混乱和冗长(真的,每个 parseInt 中都有一个额外的参数?)所以我希望有一个更好的方法。


12
投票
function parseDecimal(s) { return parseInt(s, 10); }

编辑:如果您不喜欢始终将“,10”添加到 parseInt() 调用中,那么创建自己的函数来执行您真正想要的操作只是一个选项。它的缺点是它是一个非标准函数:如果你经常使用它,对你来说会更方便,但对其他人来说可能会更混乱。


10
投票

指定基础:

var number = parseInt(s, 10);

7
投票

如果没有第二个参数,将 parseInt 替换为假定十进制的版本会不会很顽皮? (注意 - 未经测试)

parseIntImpl = parseInt
parseInt = function(str, base){return parseIntImpl(str, base ? base : 10)}

7
投票

您也可以使用一元运算符 (+),而不是使用 parseFloat 或 parseInt。

+"01"
// => 1

+"02"
// => 2

+"03"
// => 3

+"04"
// => 4

+"05"
// => 5

+"06"
// => 6

+"07"
// => 7

+"08"
// => 8

+"09"
// => 9

并且为了更好的措施

+"09.09"
// => 9.09

MDN链接

一元加运算符位于其操作数之前并计算其操作数,但尝试将其转换为数字(如果尚未转换为数字)。虽然一元否定 (-) 也可以转换非数字,但一元加是将某些内容转换为数字的最快且首选的方式,因为它不对数字执行任何其他操作。


5
投票

十进制怎么样:

('09'-0) === 9  // true

('009'-0) === 9 // true

5
投票

此问题无法在 最新* Chrome 或 Firefox (2019) 中重现。

测试:

console.log(parseInt('08'));

*“自 (ECMAScript 5) JavaScript 已放弃此行为,但您应该 仍然指定基数以满足较旧的浏览器。” 来源


4
投票

如果您已经使用 parseInt 完成了一堆编码,并且不想在所有内容中添加“,10”,您可以重写该函数以使基数 10 成为默认值:

window._oldParseInt = window.parseInt;
window.parseInt = function(str, rad) {
    if (! rad) {
        return _oldParseInt(str, 10);
    }
    return _oldParseInt(str, rad);
};

这可能会让后来的读者感到困惑,因此创建一个 parseInt10() 函数可能更不言自明。就我个人而言,我更喜欢使用一个简单的函数,而不是一直添加“,10”——只会创造更多的错误机会。

© www.soinside.com 2019 - 2024. All rights reserved.