Heim  >  Artikel  >  Web-Frontend  >  Warum ist „040' in JavaScript gleich „32'?

Warum ist „040' in JavaScript gleich „32'?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-21 14:43:09526Durchsuche

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

Führende Nullen in JavaScript

Frage:

Warum wird 40 in JavaScript als 32 dargestellt?

var num = 040;
console.log(num); // 32

Antwort:

In JavaScript wird die Zahl aufgrund der führenden 0 als Oktalzahl (Basis 8) behandelt, genau wie es das führende 0x macht Es ist dasselbe wie Hexadezimal (Basis 16). Dieses Verhalten hat eine lange Geschichte, aber im modernen JavaScript werden Oktalzahlen nicht mehr in dieser Form geschrieben. Im modernen JavaScript im strikten Modus ist das „traditionelle“ Oktalformat ein Syntaxfehler; Oktalzahlen sollten mit dem Präfix 0o geschrieben werden.

Geschichte:

In den frühen Tagen (in der ursprünglichen Netscape-Sprache und der ersten und zweiten ECMAScript-Spezifikation) stellten führende Nullen in numerischen Literalen offiziell Oktalzahlen (Basis 8) dar ), genau wie das führende 0x hexadezimal (Basis) angibt 16):

OctalIntegerLiteral ::
    0 OctalDigit
    OctalIntegerLiteral OctalDigit

Zum Beispiel sind 10, 012 und 0xA alles Arten, die Dezimalzahl 10 zu schreiben. Dies steht im Einklang mit einigen anderen Sprachen (wie C, C++ und Java), deren Syntax der von JavaScript ähnelt, aber sehr verwirrend ist.

Ab ECMAScript 3 wurde diese Form von Oktalliteralen auf eine optionale Erweiterung herabgestuft, und dezimale Ganzzahlliterale wurden so geändert, dass sie keine führenden Nullen haben können (es sei denn, die Implementierung enthält die Erweiterung):

DecimalIntegerLiteral ::
    0
    NonZeroDigit DecimalDigits(opt)

Aber im strikten Modus verbietet ECMAScript 5 dies:

Beim Umgang mit striktem Moduscode (siehe 10.1.1) sollte eine konforme Implementierung die Syntax von NumericLiteral nicht erweitern, um OctalIntegerLiteral einzuschließen, wie in B.1.1 beschrieben.

ECMAScript 6 (ECMAScript 2015) führte BinaryIntegerLiteral und OctalIntegerLiteral ein, sodass wir jetzt kohärentere Literale haben:

  • BinaryIntegerLiteral, mit dem Präfix 0b oder 0B.
  • OctalIntegerLiteral, mit Präfix 0o oder 0O.
  • HexIntegerLiteral, mit dem Präfix 0x oder 0X.

Die alte OctalIntegerLiteral-Erweiterung wurde in LegacyOctalIntegerLiteral umbenannt, was im nicht-strikten Modus weiterhin zulässig ist.

Fazit:

Wenn Sie also Oktalzahlen analysieren möchten, können Sie das Präfix 0o oder 0O (von älteren Browsern nicht unterstützt) oder parseInt verwenden.

Wenn Sie sicherstellen möchten, dass Ihre Zahl als Basis 10 geparst wird, entfernen Sie führende Nullen oder verwenden Sie parseInt.

Beispiel:

  • 010

    • im strikten Modus (erfordert ECMAScript 5) handelt es sich um einen Syntaxfehler.
    • Im nicht strikten Modus kann es sich um einen Syntaxfehler handeln oder 8 zurückgeben (abhängig von der Implementierung).
  • 0o10, 0O10

    • Vor ECMAScript 6 handelte es sich um Syntaxfehler.
    • In ECMAScript 6 geben sie 8 zurück.
  • parseInt('010', 8)

    • Es gibt 8 zurück.
  • parseInt('010', 10)

    • Es gibt 10 zurück.

Bei Interesse finden Sie hier die aktuell neuesten Spezifikationen und hier historische Versionen.

Das obige ist der detaillierte Inhalt vonWarum ist „040' in JavaScript gleich „32'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn