为什么在严格模式下不允许使用八进制数字文字(什么是变通方法?)

xam*_*mir 13 javascript octal ecmascript-5 strict-mode

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

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

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

Ami*_*mit 12

这个问题的"为什么"部分并不是真正的问题.

至于"如何",我的头顶......

"use strict";
var x = parseInt('010', 8);
document.write(x);
Run Code Online (Sandbox Code Playgroud)


Pat*_*rts 12

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

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

console.log(eight, nine, ten, eleven);
Run Code Online (Sandbox Code Playgroud)

似乎无害,对吧?我们使用OCD的程序员只想将所有逗号对齐,以便它看起来更好.但问题出在这里:

8 9 8 9
Run Code Online (Sandbox Code Playgroud)

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

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

以下是两个"解决方案":

"use strict";

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

console.log(eight, nine, ten, eleven);
Run Code Online (Sandbox Code Playgroud)

"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);
Run Code Online (Sandbox Code Playgroud)

  • (来自另一位有强迫症的程序员)这是对 OP 的“有什么危害?”的最明确的回答。- 以及用于对齐的填充的最佳解决方案。 (2认同)

小智 6

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

const NINE = 0o11; // octal
const TEN = 0b1010; // binary
const SEVENTEEN = 0x11; // hexa
Run Code Online (Sandbox Code Playgroud)


gsn*_*ers 5

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

JS中的八进制一直是标准的非标准扩展(在ES5中引入了严格模式,它们在附录B中,它是大多数实现支持的非标准功能的集合:除了它定义了octals in a方式与网站要求的方式不兼容),严格模式试图禁止所有非标准扩展.关于它们为什么从未标准化的"原因"是一个明显的相关问题,而我并不知道.

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

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