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:
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
0o10, 0O10
parseInt('010', 8)
parseInt('010', 10)
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!