为什么JavaScript将前导零的数字视为八进制

为什么JavaScript将前导零的数字视为八进制,javascript,Javascript,JS引擎将数字x转换为八进制数字。为什么会这样?如何防止它?这是因为一些JavaScript引擎将前导零解释为八进制数文本。其定义见附录 但是,在严格模式下,一致性实现不得实现该功能-请参阅: 处理严格模式代码时的一致性实现(参见 10.1.1),不得扩展NumericLiteral的语法,以包括B.1.1中所述的OctalIntegerLiteral 由于这种模糊性,最好不要使用前导零。我想我的答案回答了这个问题,但这个问题并不完全是重复的,所以我附上了我答案的副本 历史 问题是十进制整数文本

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

这是因为一些JavaScript引擎将前导零解释为八进制数文本。其定义见附录

但是,在严格模式下,一致性实现不得实现该功能-请参阅:

处理严格模式代码时的一致性实现(参见 10.1.1),不得扩展NumericLiteral的语法,以包括B.1.1中所述的OctalIntegerLiteral

由于这种模糊性,最好不要使用前导零。

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

历史

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

DecimalIntegerLiteral::
0
非零位小数位数(opt)
但是,ECMAScript3允许(作为可选扩展)解析base8中前导零的文本:

Octalintegerlateral::
0八达吉特
八面平行八面体
但禁止在严格模式下这样做:

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

介绍了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

JS仅当带前导零的数字是有效的八进制时才将其视为八进制,否则将其视为十进制。要防止这种情况,请不要在源代码中使用前导零

控制台日志(010,10,+“010”)
if(021<019)console.log('Paradox')什么是日志?@Andy-10,不是8。他在问为什么在数字前面加上0会使它假定为八进制。我不怪他问这个问题。一个以0开头的文字数字值总是被解释为八进制值。哈,是的,我没有正确地问这个问题。我知道为什么它会记录为八进制,我只是想知道10是否是OP的预期输出。如果我们用0x作为数字的前缀,那么它也会将数字转换为十六进制。这不是JS文本的语法。这是一个在严格模式下被明确禁止的非标准扩展。右:)从未注意到这一点。让我给这个问题加1分。答案已修复。“未捕获的语法错误:严格模式下不允许使用带前导零的小数。”
var x = 010;
console.log(x); //8