Если я наберу 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 и должен уделять особое внимание спецификация - и их отклонения.)