質問に少し遅れましたが、良い答えができると思います。
受け入れられた答えは、あなたが実際に知っていること以上のことを教えてくれず、質問自体に言及していNumber(value)
ます。+value
parseInt(value)
重要なのは、型変換と解析の間に意味的な違いがあることを知ることです。
8 進数の文字列が 10 進数としてキャストされるのはなぜですか?
Function ( ) および単項演算子( ) として呼び出されるNumber コンストラクターは、内部演算を使用するためです。これらの構造の目的は型変換です。Number(value)
+
+value
ToNumber
がToNumber
文字列型に適用されると、 と呼ばれる特別な文法生成が使用されStringNumericLiteral
ます。
このプロダクションは、10 進リテラルと 16 進整数リテラルのみを保持できます。
...
StrNumericLiteral :::
StrDecimalLiteral
HexIntegerLiteral
...
この文法と「通常」の文法の間には意味上の違いもありますNumericLiterals
。
A StringNumericLiteral
:
- 空白および/または行末記号が前後にある場合があります。
- つまり、10 進数には先頭の 0 桁がいくつあってもかまいません。八進数なし!
- つまり、10 進数の前に + または - を付けて、その符号を示すことができます。
- 空または空白のみを含むものは +0 に変換されます。
次にparseInt
andparseFloat
関数を使用します。
これらの関数の目的は明らかにparsingであり、これは型変換とは意味的に異なります。次に例を示します。
parseInt("20px"); // 20
parseInt("10100", 2); // 20
parseFloat("3.5GB"); // 3.5
// etc..
のアルゴリズムが ECMAScript 5th Edition 仕様で変更されたことに言及する価値がありますparseInt
。数値の基数が先行ゼロを持つためだけに 8 進数として解釈されなくなりました。
parseInt("010"); // 10, ECMAScript 5 behavior
parseInt("010"); // 8, ECMAScript 3 behavior
ご覧のとおり、これにより ES3 と ES5 の実装間の動作に互換性がなくなりました。問題を回避するために、いつものように基数引数を使用することをお勧めします。
2 番目の質問:
ECMAScript 5th Edition の厳密モードで 8 進リテラルが削除されるのはなぜですか?
実際、この 8 進リテラルを取り除く取り組みは 1999 年から行われています。8 進リテラル生成 (OctalIntegerLiteral
および) は、 ECMAScript 3rd Edition 仕様以降、 sOctalEscapeSequence
の文法から削除されました。古いバージョンとの後方互換性( ES5 にも含まれています) のために含まれている可能性があります。標準の。NumericLiteral
実際、それらはすべての主要な実装に含まれていますが、技術的には、ES3 または ES5 に準拠した実装では、非規範的であると説明されているため、それらを含めないことを選択できます。
これが最初のステップでした。現在、ECMAScript 5 Strict Modeではそれらを完全に禁止しています。
しかし、なぜ?
それらはエラーが発生しやすい機能であると考えられていたため、実際、過去には、暗黙の8進数の同じ問題と同じように、意図しない、またはキャッチするのが難しいparseInt
バグを引き起こしました。
現在、厳密モードでは、8 進リテラルはSyntaxError
例外を引き起こします — 現在のところ、Firefox 4.0 Betas でのみ観測可能です —。