为啥在严格模式下不允许使用八进制数字文字(以及解决方法是啥?)

Posted

技术标签:

【中文标题】为啥在严格模式下不允许使用八进制数字文字(以及解决方法是啥?)【英文标题】: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 年(可能更多)的任何其他流行用例。 【参考方案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 年答案。

以上是关于为啥在严格模式下不允许使用八进制数字文字(以及解决方法是啥?)的主要内容,如果未能解决你的问题,请参考以下文章

严格模式下不允许对象文字中的重复数据属性

Node JS readFileSync严格模式下不允许八进制转义序列

AngularJS ie 11 中严格模式下不允许对只读属性赋值

为啥 PHP 在一种情况下允许将文字传递给按引用传递的参数,而在其他情况下不允许?

strict 模式下不允许一个属性有多个定义

vb .net,涉及严格模式的javascript问题