带有前导零的 Javascript parseInt()

Javascript 的 parseInt 函数似乎不能完全工作。

parseInt("01") returns 1
parseInt("02") returns 2
parseInt("03") returns 3
parseInt("04") returns 4
parseInt("05") returns 5
parseInt("06") returns 6
parseInt("07") returns 7
parseInt("08") returns 0
parseInt("09") returns 0

你无法解释

编辑 自从这个问题被提出和回答以来,默认为八进制基数的“特征”已经被否定了

71318 次浏览

parseInt的调用应始终在第二个参数中指定一个基:

parseInt("08", 10);

早期版本的 JavaScript 将以 0开头的字符串视为八进制数(当没有指定基数时) ,而且 0809都不是有效的八进制数。

来自 Mozilla 文件:

如果基数未定义或为0,JavaScript 假定如下:

  • 如果输入字符串以“0X”或“0X”开头,则基数为16 (十六进制)。
  • 如果输入字符串以“0”开头,则基数为8 (八进制)。这个特性是非标准的,并且一些实现 故意不支持它(而是使用基数10) 原因 使用 parseInt 时始终指定基数
  • 如果输入字符串 以任何其他值开始,基数是10(十进制)。

如果第一个字符不能转换为数字,parseInt 将返回 NaN。

ECMAScript 3标准来看:

当基数为0或 未定义且字符串的编号以 < strong > 0开头时 数字后面没有跟随 XX,则实施可在其 判断力,解释数字或者是八进制或者是 鼓励实现在这里解释数字 大小写为小数。

最新版本的 JavaScript (ECMAScript 5) 放弃这种行为,但是您应该使用 仍然指定基数来满足旧的浏览器。

这是因为如果一个数字以’0’开头,它被视为基数8(八进制)。

可以通过将 base 作为第2个参数传递来强制执行 base。

parseInt("09", 10) // 9

根据 那些文件,第2个参数是可选的,但是它的 并不总是假定为10,正如您在示例中看到的。

有一个 Radix 参数

parseInt(value, base)

底部是基数的地方。

在本例中,您正在计算基数为10(十进制)的数字, 因此使用

parseInt(value, 10);

这在新的浏览器中似乎并不完全有效。如果执行“ parseInt (“08”)”,Internet Explorer 9和10将返回8,而 Internet Explorer 8和以前的版本将返回0(在稀奇模式下的 IE10也将返回0)。

最新版本的 Chrome 也返回8,所以他们最近一定改变了解释。

提示: 正如您现在所知道的那样,默认的八进制已被弃用。以下是在遗留浏览器中修复它的方法

// ES-5 15.1.2.2
if (parseInt('08') !== 8 || parseInt('0x16') !== 22) {
parseInt = (function (origParseInt) {
var hexRegex = /^0[xX]/;
return function parseIntES5(str, radix) {
str = String(str).trim();
if (!Number(radix)) {
radix = hexRegex.test(str) ? 16 : 10;
}
return origParseInt(str, radix);
};
}(parseInt));
}

这个问题现在已不再适用。但是您仍然可以在 parseInt中使用基数将其他碱基的数目转换为以10为基数。例如:

var baseTwoNumber = parseInt('0010001', 2);

返回 17(它是 0010001的基数 -10)。

在大多数浏览器中,这个问题似乎已经改变了。

Firefox 51.0.1(64位)

parseInt("09")   // 9

Chrome 55.0.2883.95(64位)

parseInt("09")   // 9

Safari 10.0(12602.1.50.0.10)

parseInt("09")   // 9

=====

推荐操作规程

话虽如此,为了安全起见和避免问题,还是按照 接受的答案中的建议使用 base/radix 参数。

parseInt("09", 10)    // 9

额外的测试

如果参数不是字符串,我也想测试一下。 Chrome 和 Safari 给出了准确的结果,Firefox 也返回了正确的结果,但是有一个警告。

parseInt(09)     // 9. (Warning: SyntaxError: 09 is not a legal ECMA-262 octal constant)