为啥在严格模式下不允许使用八进制数字文字(以及解决方法是啥?)
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 中严格模式下不允许对只读属性赋值