Si escribo 019 > 020en la consola de JavaScript (probada tanto en Chrome como en Firefox), obtengo la respuestatrue .
Esto se debe a que 020se interpreta como OctalIntegerLiteral(igual 16) mientras 019que aparentemente se interpreta como DecimalLiteral(y es igual 19). Como 19es mayor que 16, 019 > 020es true.
Lo que me desconcierta es por qué 019se interpreta como un DecimalLiteralprimer lugar. ¿Qué producción es? DecimalIntegerLiteralno permite 019:
DecimalIntegerLiteral ::
0
NonZeroDigit DecimalDigits_opt
OctalIntegerLiteraltampoco permite 019(ya 9que 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 == 19y020 + 0 == 17por lo que está ignorando el cero inicial si contiene dígitos octales no.