Якщо я вводжу 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 і повинен звертати особливу увагу на специфікацію та її відхилення.)
019 + 0 == 19
і020 + 0 == 17
тому він ігнорує початковий нуль, якщо він містить не восьмеричні цифри.