24

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

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

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

4

6 回答 6

22

不允许使用八进制文字,因为不允许使用八进制文字会阻止程序员在脚本中使用前导零作为填充。例如,查看以下代码段:

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

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

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

8 9 8 9

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

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

以下是两个“解决方案”,分别是:

"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);

于 2015-12-18T15:14:28.610 回答
19

问题的“为什么”部分并不能真正回答。

至于“如何”,我的头顶上...

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

于 2015-12-18T14:58:37.597 回答
13

现在,有了对 ES6 的大型浏览器支持,你可以这样写:

const NINE = 0o11; // octal
const TEN = 0b1010; // binary
const SEVENTEEN = 0x11; // hexa
于 2017-12-20T01:19:50.433 回答
5

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

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

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

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

于 2015-12-18T15:06:50.183 回答
1

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

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

于 2021-11-15T20:15:24.117 回答
-4

对于 JS 中“严格模式”中的 JSON,您可能使用了错误的字符串文字('')。

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

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

于 2021-06-24T07:42:54.590 回答