ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript ではなぜ「040」が「32」と等しいのでしょうか?

JavaScript ではなぜ「040」が「32」と等しいのでしょうか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-21 14:43:09522ブラウズ

Why Does `040` Equal `32` in JavaScript?

JavaScript での先頭のゼロの数字

質問:

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 が導入されたため、より一貫したリテラルが追加されました:

  • BinaryIntegerLiteral (接頭辞 0b または 0B)。
  • OctalIntegerLiteral、接頭辞 0o または 0O が付きます。
  • HexIntegerLiteral、接頭辞 0x または 0X。

古い OctalIntegerLiteral 拡張機能は LegacyOctalIntegerLiteral に名前変更され、非厳密モードでは引き続き許可されます。

結論:

したがって、8 進数を解析したい場合は、0o または 0O プレフィックス (古いブラウザではサポートされていません) を使用するか、parseInt を使用できます。

数値が 10 進数として解析されるようにするには、先頭のゼロを削除するか、parseInt を使用します。

例:

  • 010

    • (厳密モード) (ECMAScript が必要) 5)、これは構文エラーです。
    • 非厳密モードでは、構文エラーになるか、8 が返される可能性があります (実装に依存します)。
  • 0o10、0O10

    • ECMAScript 6 より前では、これらは構文エラーでした。
    • ECMAScript 6 では、8 を返します。
  • parseInt('010', 8)

    • 8 を返します。
  • parseInt('010', 10)

    • 10 を返します。

ご興味がございましたら、現在の最新の仕様はここで、過去のバージョンはこちらでご覧いただけます。

以上がJavaScript ではなぜ「040」が「32」と等しいのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。