Если я наберу 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