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
作为八进制(当没有指定基址时), 08
和09
都不是有效的八进制数。
从Mozilla 文档 :
如果基数未定义或0,JavaScript假定如下:
- 如果inputstring以“0x”或“0X”开头,则基数为16(hex)。
- 如果inputstring以“0”开始,则基数为八(八进制)。 这个function是非标准的,有些实现故意不支持它(而是使用基数10)。 出于这个原因, 当使用parseInt时总是指定一个基数 。
- 如果inputstring以任何其他值开头,则基数为10(十进制)。
如果第一个字符不能转换为数字,parseInt将返回NaN。
并从ECMAScript 3标准:
如果基数为0或未定义 ,并且string的数字以0或者数字开始,而后跟一个x或X ,则实现可以根据自己的判断将数字解释为八进制或十进制。 鼓励实现在这种情况下将数字解释为十进制。
最新版本的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)