var x = 010;
console.log(x); //8
JSエンジンは、数値xを8進数に変換します。 どうしてですか? どうすればそれを防ぐことができますか?JavaScriptが先行ゼロを持つ場合、数値を8進数として扱う理由
var x = 010;
console.log(x); //8
JSエンジンは、数値xを8進数に変換します。 どうしてですか? どうすればそれを防ぐことができますか?JavaScriptが先行ゼロを持つ場合、数値を8進数として扱う理由
私の答えはhereだと思いますが、質問は正確には重複していないので、私は私の答えのコピーを含めます。
履歴
問題は、10進整数リテラルは先行ゼロ持つことができないということである。しかし
DecimalIntegerLiteral ::
0
NonZeroDigit DecimalDigits(opt)
、ECMAScriptの 3が許可(オプションの拡張など)を先行ゼロを持つリテラルを解析しますベースで 8:
OctalIntegerLiteral ::
0 OctalDigit
OctalIntegerLiteral OctalDigit
しかしECMAScript 5は、厳密モードでそれを行う禁じ:
適合実装strict mode code (see 10.1.1)を処理する場合、B.1.1に記載されているようにOctalIntegerLiteralを含むことNumericLiteralの構文を拡張してはなりません。
ECMAScript 6ので、今、我々はより一貫性のリテラル持って、BinaryIntegerLiteralとOctalIntegerLiteralが導入されています
0b
または0B
接頭辞を。0o
または0O
)。0x
または0X
です。古いOctalIntegerLiteral拡張はまだ非strictモードで許可されているLegacyOctalIntegerLiteral、に変更されました。
結論したがって
、あなたは、ベース 8に番号を解析0o
か0O
プレフィックス(古いブラウザでサポートされていない)を使用する、またはparseInt
を使用したい場合。
数字が10進数で解析されるようにするには、先行ゼロを削除するか、parseInt
を使用します。
例厳密モードで
010
8
(実装に依存)をスローまたは返すことがあります。 ECMAScriptの6前0o10
、0O10
8
を返します。parseInt('010', 8)
8
を返します。parseInt('010', 10)
10
を返します。JavaScriptエンジンのなかには、先行ゼロを8進数のリテラルとして解釈するためです。これは、付録のECMAScript specificationで定義されています。
しかし、厳密モードでは、適合実装はそれを実装してはならない - 再度ECMAScript specification参照:
( 10.1.1を参照)を厳密モードのコードを処理し、構文を拡張してはならない適合実装をB.1.1で説明したOctalIntegerLiteralを含めるNumericLiteral。
このあいまいさのため、先行ゼロを使用しない方が良いです。
JSリテラルの構文ではありません。 strictモードで明示的に禁止されている、非推奨の標準化されていない拡張機能です。 – Oriol
右:)気づいたことはありません。私は質問に+1を与えました。回答が修正されました。 –
ログとは何ですか? – Andy
@Andy - 10ではなく、8です。なぜなら、数字の前に0をつけると、それが8進数であると仮定する理由がわかります。私は彼に尋ねて責任を負わない。 – Archer
0で始まるリテラル数値は、常に8進値として解釈されます。 –