Якщо я вводжу 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тому він ігнорує початковий нуль, якщо він містить не восьмеричні цифри.