質問:
JavaScript ではなぜ 40 が 32 として表されるのですか?
var num = 040; console.log(num); // 32
答え:
JavaScript では、先頭の 0x と同じように、先頭に 0 があるため、数値は 8 進数 (基数 8) として扱われます。 16 進数 (基数 16) と同じです。この動作には長い歴史がありますが、最新の JavaScript では、8 進数はこの形式で記述されなくなりました。厳密モードを使用する最新の JavaScript では、「従来の」8 進数形式は構文エラーです。8 進数は接頭辞 0o を付けて記述する必要があります。
歴史:
初期の頃 (元の Netscape 言語および最初と 2 番目の ECMAScript 仕様では)、数値リテラルの先頭の 0 は正式に 8 進数 (基数 8) で表されていました。 )、先頭の 0x が 16 進数 (基数) を示すのと同様に、 16):
OctalIntegerLiteral :: 0 OctalDigit OctalIntegerLiteral OctalDigit
たとえば、10、012、および 0xA はすべて 10 進数 10 の書き方です。これは、構文が JavaScript に似ている他の言語 (C、C++、Java など) と一致していますが、非常に混乱します。
ECMAScript 3 以降、この形式の 8 進リテラルはオプションの拡張機能に降格され、10 進整数リテラルは先頭にゼロを付けられないように変更されました (実装に拡張機能が含まれていない限り)。
DecimalIntegerLiteral :: 0 NonZeroDigit DecimalDigits(opt)
しかし、厳密モードでは、ECMAScript 5 はこれを禁止します:
厳密モードのコードを扱うとき (「 10.1.1)に準拠する実装は、B.1.1で説明されているように、OctalIntegerLiteralを含むようにNumericLiteralの構文を拡張すべきではありません(SHOULD)。
ECMAScript 6 (ECMAScript 2015) では BinaryIntegerLiteral と OctalIntegerLiteral が導入されたため、より一貫したリテラルが追加されました:
古い OctalIntegerLiteral 拡張機能は LegacyOctalIntegerLiteral に名前変更され、非厳密モードでは引き続き許可されます。
結論:
したがって、8 進数を解析したい場合は、0o または 0O プレフィックス (古いブラウザではサポートされていません) を使用するか、parseInt を使用できます。
数値が 10 進数として解析されるようにするには、先頭のゼロを削除するか、parseInt を使用します。
例:
010
0o10、0O10
parseInt('010', 8)
parseInt('010', 10)
ご興味がございましたら、現在の最新の仕様はここで、過去のバージョンはこちらでご覧いただけます。
以上がJavaScript ではなぜ「040」が「32」と等しいのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。