Wenn ich 019 > 020
die JavaScript-Konsole eingebe (sowohl in Chrome als auch in Firefox getestet), erhalte ich die Antwort true
.
Dies ist darauf zurückzuführen, 020
dass es als OctalIntegerLiteral
(gleich 16
) 019
interpretiert wird, während es anscheinend als DecimalLiteral
(und gleich 19
) interpretiert wird . Da 19
ist größer als 16
, 019 > 020
ist true
.
Was mich verwundert ist, warum 019
wird als DecimalLiteral
an erster Stelle interpretiert . Um welche Produktion handelt es sich? DecimalIntegerLiteral
erlaubt nicht 019
:
DecimalIntegerLiteral ::
0
NonZeroDigit DecimalDigits_opt
OctalIntegerLiteral
erlaubt auch nicht 019
(da 9
es sich nicht um eine Oktalstelle handelt):
OctalIntegerLiteral ::
0 OctalDigit
OctalIntegerLiteral OctalDigit
OctalDigit :: one of
0 1 2 3 4 5 6 7
Von dem, was ich in der Spezifikation sehe, 019
sollte eigentlich abgelehnt werden, ich verstehe nicht, warum es als Dezimalzahl interpretiert wird.
Ich denke, hier gibt es eine Art Kompatibilitätsregel, aber ich habe keine formale Definition gefunden. Könnte mir bitte jemand dabei helfen?
(Warum ich das brauche: Ich entwickle einen JavaScript / ECMAScript-Parser für Java mit JavaCC und muss besonders auf die Spezifikation und deren Abweichungen achten.)
quelle
019 + 0 == 19
und020 + 0 == 17
so ignoriert es die führende Null, wenn sie nicht oktale Ziffern enthält.'use strict'; 019
Unterhaltsame Tatsache: → SyntaxError: Oktalliterale und Oktal-Escape-Sequenzen sind veraltet020 + 0 ≠≠ 17
:)0
oderNonZeroDigit DecimalDigits_opt
. Wenn0
etwas folgt, ist es nichtDecimalIntegerLiteral
mehr.Antworten:
Nach allem, was ich finden konnte, scheinen einige Implementierungen von JavaScript in diesem Punkt einfach nicht der Spezifikation zu folgen.
Von der MDN-Site:
Dies erklärt immer noch nicht, warum
019 == 19
, da die nächste Ziffer nach der führenden 0 1 ist und die ganze Zahl daher als oktal analysiert werden sollte. Der Fehler, auf den verwiesen wird, scheint jedoch mit Ihrem Fall in Zusammenhang zu stehen. Die Beschreibung lautet:Der Fehler wird als WONTFIX geschlossen
Es
019
wäre jedoch ein gültiges Dezimalliteral mit einem Wert von 19 gemäß dem Entwurf der nächsten Ausgabe:https://people.mozilla.org/~jorendorff/es6-draft.html#sec-additional-syntax-numeric-literals
(Ich habe die entsprechenden Regeln markiert)
So
01
ist einLegacyOctalLikeDecimalIntegerLiteral
(3). Dann019
ist eineNonOctalDecimalIntegerLiteral
(2), die wiederum eineDecimalIntegerLiteral
(1) ist.quelle
019
mit Spidermonkey-Erträgen1: warning: 09 is not a legal ECMA-262 octal constant: 019
. Es scheint, als wäre es zurückgesetzt worden, weil bestehende (wichtige) Websites kaputt gehen würden.019
, nur weil die zweite Ziffer eine ist1
? Sicherlich kann alles, was ein enthält,9
nicht oktal sein…