试试这个:
var num = 040;
console.log(num); // 32
因为时间是40 = 32?
答案 0 :(得分:13)
前导零,数字被解释为八进制,4 * 8 = 32。
答案 1 :(得分:7)
由于前导0
,它被视为八进制(基数为8),就像前导0x
会使其成为十六进制(基数为16)。这有着漫长而折磨的历史,不再是现代JavaScript中如何编写八进制数字。在使用严格模式的现代JavaScript中,“遗留”八进制格式是语法错误;八进制数字用0o
前缀写成。
早期(使用Netscape的初始语言以及第一和第二个ECMAScript规范),数字文字中的前导0
正式表示 octal (基数为8),就像前导0x
表示十六进制(基数为16):
OctalIntegerLiteral ::
0 OctalDigit
OctalIntegerLiteral OctalDigit
例如,10
,012
和0xA
都是写十进制数十的方法。这与其他一些语法类似于JavaScript(C,C ++,Java,...)的语言保持一致,但它非常令人困惑。
从ECMAScript 3开始,这种形式的八进制文字被降级为可选扩展名,十进制整数文字被更改为不能有前导零(除非实现包含扩展名):
DecimalIntegerLiteral ::
0
NonZeroDigit DecimalDigits(opt)
但ECMAScript 5禁止在严格模式下执行此操作:
在处理strict mode code (see 10.1.1)时,符合要求的实现不得扩展 NumericLiteral 的语法,以包含 OctalIntegerLiteral ,如B.1.1中所述。
ECMAScript 6(ECMAScript 2015)介绍 BinaryIntegerLiteral 和 OctalIntegerLiteral ,所以现在我们有了更多连贯的文字:
0b
或0B
。0o
或0O
。0x
或0X
。旧的 OctalIntegerLiteral 扩展程序已重命名为 LegacyOctalIntegerLiteral ,在非严格模式下仍允许使用此扩展程序。
<强>结论强>
因此,如果您要解析基数为8的数字,请使用0o
或0O
前缀(旧浏览器不支持),或使用parseInt
。
如果您想确保您的数字将在基数10中解析,请删除前导零,或使用parseInt
。
<强>实施例强>
010
8
(取决于实现)。0o10
,0O10
8
。parseInt('010', 8)
8
。parseInt('010', 10)
10
。答案 2 :(得分:5)
因为0
前缀表示八进制数(基数为8)。