带前导零的Javascript parseInt()
Javascript的parseInt函数似乎不能完全工作带前导零的Javascript parseInt(),javascript,Javascript,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") retur
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
你无法解释
编辑自从提出并回答了这个问题后,默认为八进制的“功能”已被弃用。[]对
parseInt
的调用应始终在第二个参数中指定一个基:
parseInt("08", 10);
早期版本的JavaScript将以0
开头的字符串视为八进制(如果未指定基数),并且08
和09
都不是有效的八进制数
来自Mozilla:
如果基数未定义或为0,JavaScript将假定:
- 如果输入字符串以“0x”或“0x”开头,则基数为16 (十六进制)李>
- 如果输入字符串以“0”开头,则基数为8
(八进制)。此功能是非标准的,有些实现
故意不支持它(而是使用基数10)。为此
原因使用parseInt时始终指定基数李>
- 如果输入字符串 从任何其他值开始,基数为10(十进制)
最新版本的JavaScript(),但仍应指定基数以满足较旧浏览器的要求。这是因为如果数字以“0”开头,则将其视为基数8(八进制) 可以通过将基底作为第二个参数传递来强制基底
parseInt("09", 10) // 9
根据,第二个参数是可选的,但并不总是假定为10,正如您从示例中看到的那样。有一个基数参数
parseInt(value, base)
其中base是基数
在本例中,您正在计算基数为10(十进制)的数字,
因此使用
parseInt(value, 10);
这在新浏览器中似乎并不完全有效。如果执行“parseInt(“08”)”,Internet Explorer 9和10将返回8,而Internet Explorer 8和以前的版本将返回0(怪癖模式下的IE10也将返回0)
Chrome的最新版本还返回8,因此他们最近一定更改了解释。提示:正如您现在所知,默认值为octal的版本何时被弃用。下面是如何在传统浏览器中修复它
// 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
中使用基数将其他基数转换为base-10。例如:
var baseTwoNumber = parseInt('0010001', 2);
返回
17
(这是0010001
的base-10)。在大多数浏览器中,这个问题现在似乎已经改变了
Firefox 51.0.1(64位)
Chrome 55.0.2883.95(64位)
Safari 10.0(12602.1.50.0.10)
=====
推荐做法
话虽如此,为了安全起见并避免出现问题,请使用中建议的base/radix参数
额外测试
我只是想测试一下,如果参数不是字符串的话。
Chrome&Safari给出了准确的结果。Firefox也会返回正确的结果,但会发出警告
parseInt(09) // 9. (Warning: SyntaxError: 09 is not a legal ECMA-262 octal constant)
你一定是在开玩笑。你不能解释。是的,你可以=>自古以来,任何以0开头的数字都代表八进制,0x代表十六进制。我相信这对所有语言来说都是通用的,但我可能又错了。仅供参考:,比在线JavaScript测试员更好。@JohnHartsock Yeh,因为我们都在这篇文章上是的,行为已经改变了。我会更新我的答案。是的,Firefox和Chrome的最新版本现在没有问题。是的,但是如果它假定为八进制,那么09应该返回11,而不是0。@PeeyushKushwaha:反过来说<基数8中的代码>11是基数10中的代码>9
09
不是一个有效的基数8。但是我想在parseInt之后使用09,有什么办法吗?因为这是不推荐使用的,将来您可以使用前导零,不是吗?注意:如果您只使用带前导零(而不是字符串)的常量,在所有当前浏览器中,它仍然被视为基数8。如果该值以0开头并且是一个数字,则parseInt仍将使用基数8。尝试parseInt(020)Yes。我甚至指出了建议的答案。我知道要避免的最佳做法和不良特性。因此,我在回答中也给出了推荐做法。
parseInt("09") // 9
parseInt("09") // 9
parseInt("09", 10) // 9
parseInt(09) // 9. (Warning: SyntaxError: 09 is not a legal ECMA-262 octal constant)