Если я наберу 019 > 020 в консоли JavaScript (проверено как в Chrome, так и в Firefox), я получу ответ true.
Это связано с тем, что 020 интерпретируется как OctalIntegerLiteral. (равно 16), тогда как 019, по-видимому, интерпретируется как DecimalLiteral a> (и равно 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, обрезая лишние нули. - person Mouser   schedule 24.01.2015019+1? - person Jongware   schedule 24.01.2015019 + 0 == 19и020 + 0 == 17, поэтому он игнорирует начальный ноль, если он содержит не восьмеричные цифры. - person Reactgular   schedule 24.01.2015'use strict'; 019→ SyntaxError: восьмеричные литералы и восьмеричные escape-последовательности устарели. - person goto-bus-stop   schedule 24.01.2015020 + 0 ≠≠ 17:) - person Jongware   schedule 24.01.2015019на самом деле не восьмеричный литерал, насколько я могу судить. - person lexicore   schedule 24.01.2015parseInt("020", 8)= 16, аparseInt("019", 8)= 1. mdn - parseInt - person Mouser   schedule 24.01.20150, либоNonZeroDigit DecimalDigits_opt. Если за0следует что-либо, это уже неDecimalIntegerLiteral. - person lexicore   schedule 24.01.2015019выдает ошибку в esprima. - person Felix Kling   schedule 24.01.2015