当前位置: 首页 > 面试题库 >

为什么JavaScript如果数字以前导零开头,则将其视为八进制

冀弘厚
2023-03-14
问题内容

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

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


问题答案:

历史

问题在于十进制整数文字不能包含前导零:

DecimalIntegerLiteral ::
    0
    NonZeroDigit DecimalDigits(opt)

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

OctalIntegerLiteral ::
    0 OctalDigit
    OctalIntegerLiteral OctalDigit

但是ECMAScript 5禁止以严格模式执行此操作:

一致性实现,在处理时严格模式代码(见10.1.1) ,必须不延伸的语法 NumericLiteral 包括_OctalIntegerLiteral_ 如描述B.1.1。

ECMAScript 6引入了 BinaryIntegerLiteralOctalIntegerLiteral,所以现在我们有了更多连贯的文字:

  • BinaryIntegerLiteral ,以0b开头0B
  • OctalIntegerLiteral ,以0o开头0O
  • HexIntegerLiteral ,以0x开头0X

旧的 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


 类似资料:
  • 问题内容: 我正在将一些JSON文件导入到我的Parse.com项目中,并且不断收到错误“无效的键:值对”。 它指出有一个意外的“ 8”。 这是我的JSON的示例: 如果我通过从中删除JSON 或将其转换为JSON来更新JSON,则它变为有效。 JSON是否真的可以接受以开头的整数,或者是否可以解决问题? 问题答案: 前导0表示JavaScript中的八进制数。八进制数字不能包含8;因此,该数字无

  • 问题内容: 我正在生成一个json对象, 当使用Newtonsoft.Json在C#中反序列化此对象时,由于前导零,因此将 0100 视为八进制数。有没有一种方法可以覆盖此功能,并将其视为十进制整数? 问题答案: 我已经看过了(读数字的“魔术”发生的方法)。我会说这是行不通的。八进制情况特别处理 然后 我没有找到任何方法来覆盖此方法(除了重写 所有 在Json解析中执行所有操作的方法) __

  • 问题内容: 为什么在Java中(我不知道任何其他编程语言)标识符不能以数字开头,为什么也不允许以下声明? 问题答案: 通常,您将这种限制放入其中有两个原因: 用电子方式解析很痛苦。 对人类来说这是一个痛苦的解析。 考虑以下代码片段: 如果是合法标识符,那么末尾有哪个值?-3还是2?这是模棱两可的。 同时考虑: 最后有什么价值?这也是模棱两可的。 另外,以任何一种方式阅读都是很痛苦的。如果有人声明,

  • 问题内容: 为什么下面的Java代码 打印’Infinity’且未定义。这在数学上不是错吗? 问题答案: 在数学中,有许多支持算术的不同结构。最突出的数字(例如自然数,整数和实数)不包括无穷大。在那些系统中,不支持除以零。 其他系统的确包含至少一个无穷大。参见,例如,真实的投影线。它确实允许被零除。 只有一种方法可以知道在特定系统中数学定义或未定义的内容-研究该系统。 类似地,操作是可交换的(a

  • 问题内容: 尝试这个: 因为什么时候40 = 32? 问题答案: 带有前导零的数字将解释为八进制和。

  • 编者按:此代码示例来自Rust 1.0之前的版本,并且在语法上是无效的Rust 1.0代码。此代码的更新版本会产生不同的错误,但答案仍然包含有价值的信息。 肯定有更好的方法将二进制字符串转换为十六进制字符串比这? 这样做的结果是 我用的是Rustc0.12。夜间