Если я наберу 019 > 020 в консоли JavaScript (протестирован как в Chrome, так и в Firefox), я получаю ответ true.
Это связано с тем, что 020 интерпретируется как OctalIntegerLiteral (равно 16), тогда как 019, по-видимому, интерпретируется как DecimalLiteral (и равно 19). Поскольку 19 больше, чем 16, 019 > 020 - true.
Что меня озадачивает, почему 019 интерпретируется как DecimalLiteral на первом месте. Какая она? DecimalIntegerLiteral не позволяет 019:
DecimalIntegerLiteral ::
0
NonZeroDigit DecimalDigits_opt
OctalIntegerLiteral также не позволяет 019 (поскольку 9 не является восьмеричной цифрой):
OctalIntegerLiteral ::
0 OctalDigit
OctalIntegerLiteral OctalDigit
OctalDigit :: one of
0 1 2 3 4 5 6 7
Итак, из того, что я вижу в спецификации, 019 должен быть фактически отклонен, я не понимаю, почему он интерпретируется как десятичное целое.
Я предполагаю, что здесь есть какое-то правило совместимости, но я не нашел формального определения. Может ли кто-нибудь помочь мне с этим?
(Почему мне это нужно: я разрабатываю парсер JavaScript/ECMAScript для Java с JavaCC и должен уделять особое внимание спецификация - и их отклонения.)