¿Por qué no puedo acceder a una propiedad de un número entero con un solo punto?

Resuelto Peter Olson asked hace 12 años • 5 respuestas

Si intento escribir

3.toFixed(5)

Hay un error de sintaxis. Usar puntos dobles, poner un espacio, poner los tres entre paréntesis o usar notación entre corchetes permite que funcione correctamente.

3..toFixed(5)
3 .toFixed(5)
(3).toFixed(5)
3["toFixed"](5)

¿Por qué no funciona la notación de un solo punto y cuál de estas alternativas debería usar en su lugar?

Peter Olson avatar Feb 21 '12 22:02 Peter Olson
Aceptado

El punto es parte del número, por lo que el código se interpretará igual que:

(3.)toFixed(5)

Naturalmente, esto generará un error de sintaxis, ya que no puede seguir inmediatamente el número con un identificador.

Cualquier método que evite que el período se interprete como parte del número funcionaría. Creo que la forma más clara es poner el número entre paréntesis:

(3).toFixed(5)
Guffa avatar Feb 21 '2012 15:02 Guffa

No puedes acceder a él debido a una falla en el tokenizador de JavaScript. Javascript intenta analizar la notación de puntos de un número como un literal de punto flotante, por lo que no puedes seguirlo con una propiedad o método:

2.toString(); // raises SyntaxError

Como mencionaste, hay un par de soluciones que se pueden usar para hacer que los números literales también actúen como objetos. Cualquiera de estos es igualmente válido.

2..toString(); // the second point is correctly recognized
2 .toString(); // note the space left to the dot
(2).toString(); // 2 is evaluated first

Para comprender más sobre el uso y las propiedades de los objetos, consulte Javascript Garden .

Rodney Folz avatar Feb 21 '2012 15:02 Rodney Folz

No funciona porque JavaScript interpreta 3.como el inicio de una constante de punto flotante (como 3.5) o una constante completa de punto flotante (con 3. == 3.0), por lo que no puede seguirlo con un identificador (en su caso , un nombre de propiedad). No reconoce que pretendías que the 3y the .fueran dos tokens separados.

Cualquiera de sus soluciones me parece bien.

ruakh avatar Feb 21 '2012 15:02 ruakh

Esta es una ambigüedad en la gramática de Javascript. Cuando el analizador tiene algunos dígitos y luego encuentra un punto, puede elegir entre "NumberLiteral" (como 3.5) o "MemberExpression" (como 3.foo). Supongo que esta ambigüedad no se puede resolver mediante una anticipación debido a la notación científica; ¿debería 3.e2interpretarse como 300o a property e2 of 3? Por lo tanto, decidieron voluntariamente preferir NumberLiterals aquí, simplemente porque en realidad no hay mucha demanda de cosas como 3.foo.

georg avatar Feb 21 '2012 15:02 georg