Si escribo 019 > 020
en la consola de JavaScript (probada tanto en Chrome como en Firefox), obtengo la respuestatrue
.
Esto se debe a que 020
se interpreta como OctalIntegerLiteral
(igual 16
) mientras 019
que aparentemente se interpreta como DecimalLiteral
(y es igual 19
). Como 19
es mayor que 16
, 019 > 020
es true
.
Lo que me desconcierta es por qué 019
se interpreta como un DecimalLiteral
primer lugar. ¿Qué producción es? DecimalIntegerLiteral
no permite 019
:
DecimalIntegerLiteral ::
0
NonZeroDigit DecimalDigits_opt
OctalIntegerLiteral
tampoco permite 019
(ya 9
que no es un dígito octal):
OctalIntegerLiteral ::
0 OctalDigit
OctalIntegerLiteral OctalDigit
OctalDigit :: one of
0 1 2 3 4 5 6 7
Por lo que veo en la especificación, 019
realidad debería rechazarse, no veo por qué se interpreta como un entero decimal.
Supongo que aquí hay algún tipo de regla de compatibilidad, pero no he podido encontrar una definición formal. ¿Podría alguien ayudarme con esto?
(Por qué necesito esto: estoy desarrollando un analizador JavaScript / ECMAScript para Java con JavaCC y tengo que prestar especial atención a la especificación y sus desviaciones).
019 + 0 == 19
y020 + 0 == 17
por lo que está ignorando el cero inicial si contiene dígitos octales no.