尝试在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有一个很好的报道。


当前回答

你也可以不用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链接

一元加号运算符位于其操作数之前,求值为其操作数,但如果操作数还不是数字,则尝试将其转换为数字。虽然一元否定(-)也可以转换非数字,但一元加号是将数字转换为数字的最快和首选的方法,因为它不会对数字执行任何其他操作。

其他回答

如果parseInt没有第二个形参,那么用一个假设为十进制的版本替换parseInt会不会很淘气?(注-未经测试)

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

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

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

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

你也可以用Number:

Number('08'); // 8

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

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

这给我的印象是迂迂的、令人困惑的和冗长的(真的,在每个parseInt中都有一个额外的参数?)所以我希望有更好的方法。

如果你已经用parseInt做了一堆编码,不想在所有东西上都加上",10",你可以重写这个函数,将base 10设为默认值:

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

这可能会使后面的读者感到困惑,因此创建parseInt10()函数可能更容易理解。就我个人而言,我更喜欢使用一个简单的函数,而不是一直添加“,10”——这只会增加出错的机会。

你也可以不用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链接

一元加号运算符位于其操作数之前,求值为其操作数,但如果操作数还不是数字,则尝试将其转换为数字。虽然一元否定(-)也可以转换非数字,但一元加号是将数字转换为数字的最快和首选的方法,因为它不会对数字执行任何其他操作。