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).
fuente

019 + 0 == 19y020 + 0 == 17por lo que está ignorando el cero inicial si contiene dígitos octales no.'use strict'; 019curioso : → SyntaxError: los literales octales y las secuencias de escape octal están en desuso020 + 0 ≠≠ 17:)0bienNonZeroDigit DecimalDigits_opt. Si0le sigue algo, ya no lo esDecimalIntegerLiteral.Respuestas:
Por lo que pude encontrar, parece que algunas implementaciones de JavaScript simplemente no siguen la especificación en ese punto.
Desde el sitio de MDN:
Esto todavía no explica por qué
019 == 19, dado que el siguiente dígito después del 0 inicial es 1 y, por lo tanto, el número entero debe analizarse como octal. Pero el error al que se hace referencia parece estar relacionado con su caso. Su descripción dice:El error está cerrado como WONTFIX
Sin embargo,
019sería un literal decimal válido, con valor igual a 19, según el borrador de la próxima edición:https://people.mozilla.org/~jorendorff/es6-draft.html#sec-additional-syntax-numeric-literals
(He marcado las reglas relevantes)
También lo
01es unLegacyOctalLikeDecimalIntegerLiteral(3). Entonces019es unNonOctalDecimalIntegerLiteral(2) que a su vez es unDecimalIntegerLiteral(1).fuente
019con los rendimientos de Spidermonkey1: warning: 09 is not a legal ECMA-262 octal constant: 019. Parece que se retiró porque los sitios (importantes) existentes se romperían.019ser un literal octal solo porque el segundo dígito es un1? Seguramente cualquier cosa que contenga un9no puede ser octal…