tipos lista funciones etiquetas ejemplos ejemplo codigo caracteristicas javascript grammar language-lawyer ecmascript-5 javacc

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 ser 0 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).