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 

你不能解释。 试一试。 (的jsfiddle)

编辑由于这个问题被问及和回答,默认为八进制的“function”已被弃用。 [ 1 ] [ 2 ]

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

您可以通过传递基础作为第二个参数来强制基础。

 parseInt("09", 10) // 9 

根据文档 ,第二个参数是可选的,但并不总是假定为10,正如你可以从你的例子看到的。

调用parseInt应该总是在第二个参数中指定一个基地址:

 parseInt("08", 10); 

早期版本的JavaScript将string0作为八进制(当没有指定基址时), 0809都不是有效的八进制数。

从Mozilla 文档 :

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

  • 如果inputstring以“0x”或“0X”开头,则基数为16(hex)。
  • 如果inputstring以“0”开始,则基数为八(八进制)。 这个function是非标准的,有些实现故意不支持它(而是使用基数10)。 出于这个原因, 当使用parseInt时总是指定一个基数
  • 如果inputstring以任何其他值开头,则基数为10(十进制)。

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

并从ECMAScript 3标准:

如果基数为0或未定义 ,并且string的数字以0或者数字开始,而后跟一个xX ,则实现可以根据自己的判断将数字解释为八进制或十进制。 鼓励实现在这种情况下将数字解释为十进制。

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

有一个基数参数

 parseInt(value, base) 

基地是基数。

在这种情况下,您正在评估base10(十进制)数字,因此使用

 parseInt(value, 10); 

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

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

此问题现在已被弃用。 但是您仍然可以在parseInt使用基数将其他基数转换为基数10。 例如,

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

返回17 (这是0010001的10的0010001 )。

提示:正如你现在知道什么时候默认为八进制已被弃用。 以下是您将如何修复旧版浏览器

 // 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)); } 

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

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 

=====

推荐做法

话虽如此,为了避免出现问题,请使用接受的答案中build议的base / radix参数。

 parseInt("09", 10) // 9 

额外的testing

我只是想testing这个,如果参数不是一个string。 Chrome和Safari提供了确切的结果。 Firefox也会返回正确的结果,但带有警告。

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