2016-05-03 5 views
4
var x = 010; 
console.log(x); //8 

JSエンジンは、数値xを8進数に変換します。 どうしてですか? どうすればそれを防ぐことができますか?JavaScriptが先行ゼロを持つ場合、数値を8進数として扱う理由

+0

ログとは何ですか? – Andy

+0

@Andy - 10ではなく、8です。なぜなら、数字の前に0をつけると、それが8進数であると仮定する理由がわかります。私は彼に尋ねて責任を負わない。 – Archer

+0

0で始まるリテラル数値は、常に8進値として解釈されます。 –

答えて

3

私の答えは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ので、今、我々はより一貫性のリテラル持って、BinaryIntegerLiteralOctalIntegerLiteralが導入されています

  • BinaryIntegerLiteral0bまたは0B接頭辞を。
  • OctalIntegerLiteral(接頭辞は0oまたは0O)。
  • HexIntegerLiteral、接頭辞は0xまたは0Xです。

古いOctalIntegerLiteral拡張はまだ非strictモードで許可されているLegacyOctalIntegerLiteral、に変更されました。

結論したがって

、あなたは、ベース  8に番号を解析0o0Oプレフィックス(古いブラウザでサポートされていない)を使用する、またはparseIntを使用したい場合。

数字が10進数で解析されるようにするには、先行ゼロを削除するか、parseIntを使用します。

例厳密モードで

  • 010
    • を(ECMAScriptの5が必要)、それがスロー。
    • 非厳密モードでは、8(実装に依存)をスローまたは返すことがあります。 ECMAScriptの6前
  • 0o100O10
    • 、彼らが投げます。
    • ECMAScript 6では、8を返します。
  • parseInt('010', 8)
    • それは8を返します。
  • parseInt('010', 10)
    • それは10を返します。
2

JavaScriptエンジンのなかには、先行ゼロを8進数のリテラルとして解釈するためです。これは、付録のECMAScript specificationで定義されています。

しかし、厳密モードでは、適合実装はそれを実装してはならない - 再度ECMAScript specification参照:

( 10.1.1を参照)を厳密モードのコードを処理し、構文を拡張してはならない適合実装をB.1.1で説明したOctalIntegerLiteralを含めるNumericLiteral。

このあいまいさのため、先行ゼロを使用しない方が良いです。

+1

JSリテラルの構文ではありません。 strictモードで明示的に禁止されている、非推奨の標準化されていない拡張機能です。 – Oriol

+0

右:)気づいたことはありません。私は質問に+1を与えました。回答が修正されました。 –

関連する問題