[英]Javascript parseInt() with leading zeros
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)
这是因为如果数字以'0'开头,则将其视为基数8(八进制)。
您可以通过将基数作为第二个参数传递来强制基数。
parseInt("09", 10) // 9
根据文档 ,第二个参数是可选的,但并不总是假设为10,正如您从示例中看到的那样。
对parseInt
调用应始终在第二个参数中指定一个基数:
parseInt("08", 10);
早期版本的JavaScript将以0
开头的字符串视为八进制(当没有指定基数时), 08
和09
都不是有效的八进制数。
从Mozilla 文档 :
如果radix未定义或为0,则JavaScript假定以下内容:
- 如果输入字符串以“0x”或“0X”开头,则基数为16(十六进制)。
- 如果输入字符串以“0”开头,则基数为8(八进制)。 此功能是非标准的,有些实现故意不支持它(而是使用基数10)。 因此, 在使用parseInt时始终指定基数 。
- 如果输入字符串以任何其他值开头,则基数为10(十进制)。
如果第一个字符无法转换为数字,则parseInt返回NaN。
从ECMAScript 3标准:
当radix为0或未定义且字符串的数字以0开头后跟x或X开头时,实现可以自行决定将数字解释为八进制或十进制。 鼓励实现将这种情况下的数字解释为十进制。
最新版本的JavaScript( ECMAScript 5 ) 放弃了这种行为 ,但您仍应指定基数以满足旧版浏览器的要求。
有一个Radix参数
parseInt(value, base)
基数是基数。
在这种情况下,您正在评估base10(十进制)数字,因此使用
parseInt(value, 10);
这在新浏览器中似乎并不完全有效。 如果执行'parseInt(“08”)',Internet Explorer 9和10将返回8,而Internet Explorer 8和以前的版本将返回0(怪异模式下的IE10也将返回0)。
Chrome的最新版本也会返回8,因此他们最近必须更改解释。
此问题现已弃用。 但你仍然可以在parseInt
使用radix将其他碱基的数量转换为base-10。 例如,
var baseTwoNumber = parseInt('0010001', 2);
返回17
(这是0010001
基数为10)。
提示:正如您现在所知,默认为八进制已被弃用。 以下是在旧版浏览器中修复它的方法
// 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
=====
话虽如此,为了安全起见并避免出现问题,请使用接受答案中建议的base / radix参数。
parseInt("09", 10) // 9
如果参数不是字符串,我只想测试它。 Chrome和Safari可提供准确的结果。 Firefox也会返回正确的结果,但会发出警告。
parseInt(09) // 9. (Warning: SyntaxError: 09 is not a legal ECMA-262 octal constant)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.