gpt4 book ai didi

javascript - 为什么 JavaScript 将具有前导零的数字视为八进制

转载 作者:可可西里 更新时间:2023-11-01 02:22:42 24 4
gpt4 key购买 nike

var x = 010;
console.log(x); //8

JS 引擎将数字x 转换为八进制数。为什么会这样?我该如何预防?

最佳答案

我想我的答案here回答了问题,但问题并不完全重复,所以我附上了我的答案的副本。

历史

问题是十进制整数文字不能有前导零:

DecimalIntegerLiteral ::
0
NonZeroDigit DecimalDigits(opt)

但是,ECMAScript 3 允许(作为可选扩展)解析以 8 为基数的带前导零的文字:

OctalIntegerLiteral ::
0 OctalDigit
OctalIntegerLiteral OctalDigit

但是ECMAScript 5禁止在严格模式下这样做:

A conforming implementation, when processing strict mode code (see 10.1.1), must not extend the syntax of NumericLiteral to include OctalIntegerLiteral as described in B.1.1.

ECMAScript 6引入了 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

关于javascript - 为什么 JavaScript 将具有前导零的数字视为八进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37003770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com