试试这个:




 var num = 040;
console.log(num); // 32 





因为40 = 32是什么时候?

评论

JavaScript parseInt八进制错误的变通办法的可能重复(即使它不是错误,也只是陷阱)

这不是错误,而是功能!

你可以接受答案吗?

我之前已经接受了您的回答,现在又接受了。奇怪的是,这不是第一次。再次感谢Levu。

#1 楼

带前导零的数字将解释为八进制和4 * 8 = 32

#2 楼

TL; DR

由于前导0,它被视为八进制(基数8),就像前导0x使其变为十六进制(基数16)一样。这具有悠久而折磨的历史,也不再是现代JavaScript如何编写八进制数字。在使用严格模式的现代JavaScript中,“旧版”八进制格式是一种语法错误;八进制数字以0o前缀编写。字面量正式表示八进制(以8为底),正如前导0表示十六进制(以16为底):

 0x 


例如,OctalIntegerLiteral :: 0 OctalDigit OctalIntegerLiteral OctalDigit 10012都是十进制数十的写法。这与语法类似于JavaScript(C,C ++,Java等)的其他一些语言保持一致,但是这非常令人困惑。

从ECMAScript 3开始,八进制文字的形式已被降级扩展为可选扩展名,并更改了十进制整数文字,以便它们不能有前导零(除非实现包括扩展名):

 0xA 


,但是ECMAScript 5禁止在严格模式下执行此操作:


处理严格模式代码时的符合标准的实现(请参见
10.1.1),不得将B.1.1中所述的NumericLiteral语法扩展为包括OctalIntegerLiteral。


ECMAScript 6(ECMAScript 2015)引入了BinaryIntegerLiteral和OctalIntegerLiteral,所以现在我们有了更加连贯的文字:



BinaryIntegerLiteral,以DecimalIntegerLiteral :: 0 NonZeroDigit DecimalDigits(opt) 0b开头。 br />
HexIntegerLiteral,以0B0o开头。

旧的OctalIntegerLiteral扩展名已重命名为LegacyOctalIntegerLiteral,但仍可以在非严格模式下使用。

结论

因此,如果要解析以8为底的数字,使用0O0x前缀(旧版浏览器不支持)或使用0X

示例



0o


在严格模式下(需要ECMAScript 5),这是一种语法错误。
在非严格模式下,可能是语法错误或返回0O(取决于实现)。



parseIntparseInt


在ECMAScript 6之前,它们是语法错误。
在ECMAScript 6中,它们返回010

返回8。 br />

如果'有兴趣,您可以在此处找到当前的生活规格,并在此处找到历史版本。

#3 楼

因为0前缀表示一个八进制数字(以8为底)。