web-dev-qa-db-ja.com

厳密モードでOctal数値リテラルが許可されないのはなぜですか(そして回避策は何ですか?)

JavaScript strictモード でOctal数値リテラルが許可されないのはなぜですか?害は何ですか?

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

開発者が Octals を使用する必要がある必要がある場合 数値の意味 を誤って変更する可能性があります)、回避策はありますか?

14
xameeramir

質問の「なぜ」の部分は、実際には答えられません。

「ハウ」に関しては、頭のてっぺんから...

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

8進数リテラルを許可しないと、プログラマはスクリプトの先頭にゼロを埋め込むことができなくなります。たとえば、次のスニペットを見てください。

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

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

無害なようですよね? OCDを使用するプログラマーは、すべてのコンマを揃えて、見栄えを良くしたいだけです。しかし、ここに問題があります:

_8 9 8 9
_

これが出力です。それがどのように不整合になるか見てください? 8と9は8進数字ではないため、すべてのゼロ詰め数値リテラルが8進に変換されるわけではありません。これらのすべてのルールを覚えておかなければならない場合、それらの一貫性を保つのは難しいため、_strict mode_を使用すると、ルールを完全に禁止することが容易になります。

代わりに、先行スペースを埋め込む必要があります。または、8進数を使用する場合は、_8_のオプションのradix引数とともに parseInt() を使用して指定します8進数。

それぞれ2つの「ソリューション」は次のとおりです。

_"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);_
12
Patrick Roberts

現在、ES6での大規模ブラウザーのサポートにより、次のように記述できます。

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

Octal数値リテラルがJavaScript Strictモードで許可されないのはなぜですか?害は何ですか?

JSの8進数は、歴史的には標準に対する非標準の拡張機能です(厳密モードを導入するES5では、それらは、ほとんどの実装がサポートする非標準の機能のコレクションである付録Bにあります。 Webサイトが要求するものと互換性のない方法)、およびストリクトモードは、すべての非標準の拡張を禁止しようとしました。それらがなぜ標準化されなかったのかについての「なぜ」は明白な関連した質問であり、私は知らない。

開発者がOctals(数値の意味を誤って変更する可能性があります)を使用する必要がある場合、回避策はありますか?

@Amitが答えたように、2番目の引数が8のparseIntは、厳密モードでも機能します。

5
gsnedders