尝试在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有一个很好的报道。
如果你已经用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”——这只会增加出错的机会。
如果你已经用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”——这只会增加出错的机会。