var num = 040;
console.log(num); // 32
因为40 = 32是什么时候?
#1 楼
带前导零的数字将解释为八进制和4 * 8 = 32
。#2 楼
TL; DR由于前导
0
,它被视为八进制(基数8),就像前导0x
使其变为十六进制(基数16)一样。这具有悠久而折磨的历史,也不再是现代JavaScript如何编写八进制数字。在使用严格模式的现代JavaScript中,“旧版”八进制格式是一种语法错误;八进制数字以0o
前缀编写。字面量正式表示八进制(以8为底),正如前导0
表示十六进制(以16为底): 0x
例如,
OctalIntegerLiteral ::
0 OctalDigit
OctalIntegerLiteral OctalDigit
,10
和012
都是十进制数十的写法。这与语法类似于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,以
0B
或0o
开头。旧的OctalIntegerLiteral扩展名已重命名为LegacyOctalIntegerLiteral,但仍可以在非严格模式下使用。
结论
因此,如果要解析以8为底的数字,使用
0O
或0x
前缀(旧版浏览器不支持)或使用0X
。 示例
0o
在严格模式下(需要ECMAScript 5),这是一种语法错误。
在非严格模式下,可能是语法错误或返回
0O
(取决于实现)。parseInt
,parseInt
在ECMAScript 6之前,它们是语法错误。
在ECMAScript 6中,它们返回
010
。 返回
8
。 br /> 如果'有兴趣,您可以在此处找到当前的生活规格,并在此处找到历史版本。
#3 楼
因为0
前缀表示一个八进制数字(以8为底)。
评论
JavaScript parseInt八进制错误的变通办法的可能重复(即使它不是错误,也只是陷阱)这不是错误,而是功能!
你可以接受答案吗?
我之前已经接受了您的回答,现在又接受了。奇怪的是,这不是第一次。再次感谢Levu。