JavaScript中前导为零的数字

JavaScript中前导为零的数字,javascript,Javascript,试试这个: var num=040; console.log(num);//32因为0前缀表示一个八进制数(基数8)。带有前导零,数字被解释为八进制,并且4*8=32TL;博士 由于前导的0,它被视为八进制(以8为基数),就像前导的0x会使它成为十六进制(以16为基数)。这有着漫长而痛苦的历史,八进制数字在现代JavaScript中已不再是如此。在使用严格模式的现代JavaScript中,“遗留”八进制格式是一个语法错误;八进制数以0o前缀写入 历史 早期(在Netscape的初始语言以及第一

试试这个:

var num=040;

console.log(num);//32
因为
0
前缀表示一个八进制数(基数8)。

带有前导零,数字被解释为八进制,并且
4*8=32
TL;博士 由于前导的
0
,它被视为八进制(以8为基数),就像前导的
0x
会使它成为十六进制(以16为基数)。这有着漫长而痛苦的历史,八进制数字在现代JavaScript中已不再是如此。在使用严格模式的现代JavaScript中,“遗留”八进制格式是一个语法错误;八进制数以
0o
前缀写入

历史 早期(在Netscape的初始语言以及第一个和第二个ECMAScript规范中),数字文本的前导
0
正式表示八进制(以8为基数),正如前导
0x
表示十六进制(以16为基数):

Octalintegerlateral::
0八达吉特
八面平行八面体
例如,
10
012
0xA
都是十进制数字10的书写方式。这与其他一些类似JavaScript(C,C++,java,…)语法的语言保持一致,但是它非常混乱。 从ECMAScript3开始,八进制文字的形式被降级为可选扩展,十进制整数文字被更改,因此它们不能有前导零(除非实现包含扩展):

DecimalIntegerLiteral::
0
非零位小数位数(opt)
但禁止在严格模式下这样做:

一致性实现在处理时,不得扩展NumericLiteral的语法以包括OctalIntegerLiteral,如中所述

(ECMAScript 2015)引入了BinaryIntegerLiteral和OctalIntegerLiteral,因此现在我们有了更连贯的文字:

  • BinaryIntegerLiteral,前缀为
    0b
    0b
  • 八进制,前缀为
    0o
    0o
  • HexIntegerLiteral,前缀为
    0x
    0x
旧的OctalIntegerLiteral扩展已重命名为LegacyOctalIntegerLiteral,在非严格模式下仍然允许该扩展

结论

因此,如果要解析base8中的数字,请使用
0o
0o
前缀(旧浏览器不支持),或使用
parseInt

如果您想确保数字以10为基数进行解析,请删除前导零,或者使用
parseInt

示例

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

如果您感兴趣,您可以找到当前的实时规范和历史版本。

可能的重复(即使它不是一个bug,只是一个陷阱)它不是bug,它是一个功能!你能接受一个答案吗?我以前接受过你的答案,现在又接受了。奇怪的是,这不是第一次。再次感谢列夫。