令人惊讶的是它返回0
。为什么?什么是获得正确结果的(正确)解决方案?
答案 0 :(得分:16)
使用基数:
var x = parseInt("08", 10);
某些JavaScript实现将第三个数字系统添加到由标准定义的两个数字系统中(十进制,默认值;和十六进制,前缀为0x
):八进制,前缀为0
。这是非标准,但在latest spec确认为常见。
由于8
不是有效的八进制数字,parseInt
会停在那里,返回值0
。
通过明确使用基数,您告诉parseInt
不要试图找出正在使用的数字系统,而是使用您指定的数字系统。键入parseInt
时,您的直觉总是指定基数;如果不这样做会让你对古怪感到开心。
答案 1 :(得分:1)
“08”表示基于8的数字。你应该指定第二个参数。
parseInt("08", 10)
答案 2 :(得分:1)
@T.J. gave a great explanation for the behaviour you see。解析数字字符串的另一种方法是使用一元+
:
var num = +"08";
答案 3 :(得分:0)
来自http://www.bennadel.com/blog/2012-Exploring-Javascript-s-parseInt-And-parseFloat-Functions.htm:
以“0”开头的字符串被假定为base8(八进制)。
答案 4 :(得分:0)
来自MDC - parseInt:
如果输入字符串以“0”开头,则基数为八(八进制)。此功能是非标准的,有些实现故意不支持它(而是使用基数10)。因此,在使用parseInt时始终指定基数。
示例:
parseInt函数( “08”); // 0,'8'不是八进制数字。
也就是说,因为没有传入基数,所以字符串以0
八进制开头。由于8
不是八进制数字,因此无法解析。
解决方案?始终提供基数参数:
parseInt("08", 10);
答案 5 :(得分:0)
如果你通过jslint运行它,它会因为你不包括radix参数而尖叫。是的,基数是可选的,但每次都可能包括在内。除非另有说明,否则以0开头的数字被假定为八进制。
var foo = parseInt("08", 10);
答案 6 :(得分:0)
前缀为“0”的数字是八进制数。 8
是无效的八进制数。所以结果是0