尝试在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标准的第5版(ECMA-262)引入了一个突破性的变化,消除了这种行为。Mozilla有一个很好的报道。


当前回答

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

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

如果您查找binary not(~),规范要求对参数进行“ToInt32”转换,该转换将明显地转换为Int32,并指定将NaN值强制为零。

是的,这是令人难以置信的粗鄙,但很方便……

其他回答

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

只需要指定基数,或者“基数”,就像这样:

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

你也可以用Number:

Number('08'); // 8

小数是这样的:

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

('009'-0) === 9 // true
function parseDecimal(s) { return parseInt(s, 10); }

edit:如果你不喜欢在parseInt()调用中一直添加",10",你可以选择创建自己的函数来做你真正想做的事情。它的缺点是作为一个非标准函数:如果你经常使用它,对你来说更方便,但对其他人来说可能更困惑。

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

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

如果您查找binary not(~),规范要求对参数进行“ToInt32”转换,该转换将明显地转换为Int32,并指定将NaN值强制为零。

是的,这是令人难以置信的粗鄙,但很方便……

指定基数:

var number = parseInt(s, 10);