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.)
019 + 0 == 19
und020 + 0 == 17
so ignoriert es die führende Null, wenn sie nicht oktale Ziffern enthält.