¿Por qué no puedo acceder a una propiedad de un número entero con un solo punto?
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?
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)
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 .
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 3
y the .
fueran dos tokens separados.
Cualquiera de sus soluciones me parece bien.
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.e2
interpretarse como 300
o a property e2 of 3
? Por lo tanto, decidieron voluntariamente preferir NumberLiteral
s aquí, simplemente porque en realidad no hay mucha demanda de cosas como 3.foo
.