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

2022-08-30 00:14: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) 的第 5 版引入了一项重大更改,消除了此行为。Mozilla有很好的文章


答案 1

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

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

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

您也可以使用数字

Number('08'); // 8

答案 2

如果您知道您的值将在有符号的 32 位整数范围内,那么在所有情况下都会执行正确的操作。~~x

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

如果查找二进制而不是 (),则规范要求对参数进行“ToInt32”转换,该参数执行到 Int32 的明显转换,并指定将值强制为零。~NaN

是的,这是非常黑客的,但非常方便...