JavaScript中前导零的数字

时间:2011-06-28 10:28:22

标签: javascript

试试这个:

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

因为时间是40 = 32?

3 个答案:

答案 0 :(得分:13)

前导零,数字被解释为八进制,4 * 8 = 32。

答案 1 :(得分:7)

TL; DR

由于前导0,它被视为八进制(基数为8),就像前导0x会使其成为十六进制(基数为16)。这有着漫长而折磨的历史,不再是现代JavaScript中如何编写八进制数字。在使用严格模式的现代JavaScript中,“遗留”八进制格式是语法错误;八进制数字用0o前缀写成。

历史

早期(使用Netscape的初始语言以及第一和第二个ECMAScript规范),数字文字中的前导0正式表示 octal (基数为8),就像前导0x表示十六进制(基数为16):

OctalIntegerLiteral ::
    0 OctalDigit
    OctalIntegerLiteral OctalDigit

例如,100120xA都是写十进制数十的方法。这与其他一些语法类似于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 ,所以现在我们有了更多连贯的文字:

  • BinaryIntegerLiteral ,前缀为0b0B
  • OctalIntegerLiteral ,前缀为0o0O
  • HexIntegerLiteral ,前缀为0x0X

旧的 OctalIntegerLiteral 扩展程序已重命名为 LegacyOctalIntegerLiteral ,在非严格模式下仍允许使用此扩展程序。

<强>结论

因此,如果您要解析基数为8的数字,请使用0o0O前缀(旧浏览器不支持),或使用parseInt

如果您想确保您的数字将在基数10中解析,请删除前导零,或使用parseInt

<强>实施例

  • 010
    • 在严格模式下(需要ECMAScript 5),这是一个语法错误。
    • 在非严格模式下,它可能是语法错误或返回8(取决于实现)。
  • 0o100O10
    • 在ECMAScript 6之前,它们是语法错误。
    • 在ECMAScript 6中,他们返回8
  • parseInt('010', 8)
    • 返回8
  • parseInt('010', 10)
    • 返回10

如果您有兴趣,可以找到当前的生活规范here和历史版本here

答案 2 :(得分:5)

因为0前缀表示八进制数(基数为8)。