【问题标题】:Why are Octal numeric literals not allowed in strict mode (and what is the workaround?)为什么在严格模式下不允许使用八进制数字文字(以及解决方法是什么?)
【发布时间】:2016-03-25 07:44:56
【问题描述】:

为什么JavaScript strict mode 中不允许使用八进制数字文字?有什么害处?

"use strict";
var x = 010; //Uncaught SyntaxError: Octal literals are not allowed in strict mode.
<h1>Check browser console for errors</h1>

如果开发人员需要使用Octals(可能会错误地更改numbers meaning),是否有解决方法?

【问题讨论】:

  • Related - 有解决方法。没有解释为什么它们是不允许的。
  • 为什么不明显?它会给人们带来很多困惑,因为在正常生活中,将前导零添加到以 10 为底的数字不会改变其值(例如,从 10 到 8。)
  • Here's another question 与八进制如何导致语言不一致 - 接受的答案也描述了它们被删除的原因。
  • @student 不是很大的损失,是吗?除了 Unix 文件权限,我认为这些天没有人使用八进制。
  • @student 这是人们想到的唯一使用八进制的情况,因为它是 3 位分组的(例如chmod 644 file)。我很想看看过去 10 年(可能更多)的任何其他流行用例。

标签: javascript ecmascript-5 octal strict-mode


【解决方案1】:

不允许使用八进制文字,因为不允许使用它们会阻止程序员在脚本中使用前导零作为填充。比如看下面的sn-p:

var eight = 0008,
    nine = 00009,
    ten = 000010,
    eleven = 011;

console.log(eight, nine, ten, eleven);

看起来足够无害,对吧?我们有强迫症的程序员只想把所有的逗号对齐,这样看起来更好。但问题来了:

8 9 8 9

这是输出。看看它变得多么不一致?并非所有的零填充数字文字都会转换为八进制,因为 8 和 9 不是八进制数字。当必须记住所有这些规则时,很难保持它们的一致性,所以strict mode 完全禁止它,从而使它们变得更容易。

您应该使用前导空格填充,或者如果您想使用八进制,则使用parseInt()8 的可选radix 参数来指定八进制。

这里分别是两个“解决方案”:

"use strict";

var eight  =  8,
    nine   =  9,
    ten    = 10,
    eleven = 11;

console.log(eight, nine, ten, eleven);

"use strict";

var eight  = parseInt('010', 8),
    nine   = parseInt('011', 8),
    ten    = parseInt('012', 8),
    eleven = parseInt('013', 8);

console.log(eight, nine, ten, eleven);

【讨论】:

  • (来自另一位患有强迫症的程序员)这是对 OP 的“有什么危害?”的最明确的答案。 - 以及对齐填充的最佳解决方案。
  • 我希望这不是真正的原因。归根结底,这并不重要,因为您可以完全抽象出语言并确保 parseInt 自行发生,但为什么不将 001 设置为语法错误并将 01 设置为有效的八进制文字?
  • @KernelDeimos 在严格模式下,任何带前导零的多位整数都是语法错误。如果你想要八进制,你应该使用 0o 前缀。我不知道是哪个规范引入了这种语法。
【解决方案2】:

问题的“为什么”部分无法真正回答。

至于“怎么做”,我想不通……

"use strict";
var x = parseInt('010', 8);
document.write(x);

【讨论】:

    【解决方案3】:

    如今,有了对 ES6 的大型浏览器支持,您可以这样写:

    const NINE = 0o11; // octal
    const TEN = 0b1010; // binary
    const SEVENTEEN = 0x11; // hexa
    

    【讨论】:

    • 很棒的演示,非常感谢。
    【解决方案4】:

    为什么在 javascript 严格模式下不允许使用八进制数字文字?有什么害处?

    JS 中的八进制历来是标准的非标准扩展(在 ES5 中,引入了严格模式,它们位于附件 B 中,这是大多数实现支持的非标准特性的集合:除了它定义八进制与网站要求的方式不兼容),并且严格模式试图禁止所有非标准扩展。关于为什么它们从未标准化的“为什么”是一个明显相关的问题,我不知道。

    如果开发人员需要使用八进制(可能会错误地改变数字的含义),是否有解决方法?

    正如@Amit 回答的那样,parseInt 的第二个参数为 8 仍然在严格模式下工作。

    【讨论】:

      【解决方案5】:

      基本上当我尝试使用这种格式时 日期 = 新日期(2021,09,07) 反应并传递给另一个组件,以便我可以转换为 ISOString() 或 toLocaleString(), // {props.toISOString()}。 我收到此错误“在严格模式下不允许使用传统八进制文字”

      但是,在删除月份和日期之前的“零”之后,将其更改为 date = new Date(2021,9,7) 它对我来说完全没问题。

      【讨论】:

      • 如果您有新问题,请点击 按钮提出问题。如果有助于提供上下文,请包含指向此问题的链接。 - From Review
      【解决方案6】:

      对于 JS 中“严格模式”中的 JSON,您可能使用了错误的 String-literals('')。

      正确:{ “名称”:“乔希” }

      错误:{ “名字”:“乔希” }

      【讨论】:

      • 我们可以看到问题中的代码和错误信息。没有 JSON。没有字符串(用于触发严格模式的字符串除外)。看看被接受的 2015 年答案。
      猜你喜欢
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 2021-08-18
      • 1970-01-01
      • 2014-06-29
      • 2018-11-11
      • 2013-05-15
      相关资源
      最近更新 更多