lista - ¿Por qué 019 no es un error de sintaxis de JavaScript? ¿O por qué es 019> 020
prompt javascript ejemplo (1)
Por lo que pude encontrar, parece que algunas implementaciones de JavaScript simplemente no siguen las especificaciones en ese punto.
Desde el sitio de MDN:
Tenga en cuenta que los literales decimales pueden comenzar con un cero (0) seguido de otro dígito decimal, pero si el siguiente dígito después del 0 inicial es menor que 8, el número se analiza como un número octal. Esto no arrojará JavaScript, vea el error 957513 . Consulte también la página sobre parseInt ().
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 siguiente programa de JavaScript debería arrojar un error:
08
Según la especificación,
DecimalIntegerLiteral
nunca puede ser0
seguido directamente por otro dígito decimal, aunque Chrome / Opera, PrestOpera y Firefox lo admiten.
El error está cerrado como WONTFIX
Sin embargo,
019
sería un literal decimal válido, con un 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)
The syntax and semantics of 11.8.3 is extended as follows except that
this extension is not allowed for strict mode code:
[...]
DecimalIntegerLiteral ::
0
NonZeroDigit DecimalDigits_opt
NonOctalDecimalIntegerLiteral // (1)
NonOctalDecimalIntegerLiteral ::
0 NonOctalDigit
LegacyOctalLikeDecimalIntegerLiteral NonOctalDigit // (2)
NonOctalDecimalIntegerLiteral DecimalDigit
LegacyOctalLikeDecimalIntegerLiteral ::
0 OctalDigit // (3)
LegacyOctalLikeDecimalIntegerLiteral OctalDigit
Entonces
01
es un
LegacyOctalLikeDecimalIntegerLiteral
(3).
Entonces
019
es un
NonOctalDecimalIntegerLiteral
(2) que a su vez es un
DecimalIntegerLiteral
(1).
Si
019 > 020
en la consola de JavaScript (probado en Chrome y Firefox), obtengo la respuesta
true
.
Esto se debe a que
020
se interpreta como
OctalIntegerLiteral
(igual a
16
) mientras que
019
aparentemente se interpreta como
DecimalLiteral
(e igual a
19
).
Como
19
es mayor que
16
,
019 > 020
es
true
.
Lo que me desconcierta es por qué
019
se interpreta como un
DecimalLiteral
en primer lugar.
¿Qué producción es?
DecimalIntegerLiteral
no permite
019
:
DecimalIntegerLiteral ::
0
NonZeroDigit DecimalDigits_opt
OctalIntegerLiteral
tampoco permite
019
(ya que
9
no es un dígito octal):
OctalIntegerLiteral ::
0 OctalDigit
OctalIntegerLiteral OctalDigit
OctalDigit :: one of
0 1 2 3 4 5 6 7
Entonces, por lo que veo en la especificación,
019
debería ser rechazado, no veo por qué se interpreta como un entero decimal.
Supongo que 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).