【问题标题】:Number with leading zero in JavaScriptJavaScript 中前导零的数字
【发布时间】:2022-01-10 04:36:52
【问题描述】:

试试这个:

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

从什么时候开始 40 = 32?

【问题讨论】:

  • Workarounds for JavaScript parseInt octal bug 的可能重复项(尽管这不是错误,只是一个问题)
  • 这不是错误,而是功能!
  • 你能接受一个答案吗?
  • 我以前接受过你的回答,现在又接受了。奇怪,这不是第一次。再次感谢 Levu。

标签: javascript


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    TL;DR

    由于前导 0,它被视为八进制(以 8 为底),就像前导 0x 将使其变为十六进制(以 16 为底)一样。这有着悠久而痛苦的历史,不再是现代 JavaScript 中八进制数的编写方式。在使用严格模式的现代 JavaScript 中,“遗留”八进制格式是语法错误;八进制数字以0o 前缀书写。

    历史

    早期(在 Netscape 的初始语言以及第一和第二个 ECMAScript 规范中),数字文字上的前导 0 正式表示 八进制(以 8 为基数),就像前导 @ 987654331@ 表示十六进制(以 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) 引入了 BinaryIntegerLiteralOctalIntegerLiteral,所以现在我们有了更多连贯的文字:

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

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

    结论

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

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

    示例

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2021-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多