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).
fuente
019 + 0 == 19
y020 + 0 == 17
por lo que está ignorando el cero inicial si contiene dígitos octales no.'use strict'; 019
curioso : → SyntaxError: los literales octales y las secuencias de escape octal están en desuso020 + 0 ≠≠ 17
:)0
bienNonZeroDigit DecimalDigits_opt
. Si0
le 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,
019
serí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
01
es unLegacyOctalLikeDecimalIntegerLiteral
(3). Entonces019
es unNonOctalDecimalIntegerLiteral
(2) que a su vez es unDecimalIntegerLiteral
(1).fuente
019
con 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.019
ser un literal octal solo porque el segundo dígito es un1
? Seguramente cualquier cosa que contenga un9
no puede ser octal…