2012-02-21 12 views
11

si trato de escribir¿Por qué no puedo acceder a una propiedad de un entero con un solo punto?

3.toFixed(5) 

hay un error de sintaxis. Usar puntos dobles, colocar un espacio, poner los tres entre paréntesis o usar notación de corchetes le permite funcionar correctamente.

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

¿Por qué no funciona la notación de punto único y cuál de estas alternativas debo usar en su lugar?

+0

tenga en cuenta que el problema solo surge con literales enteros: un decimal puede llamar a cualquier método. 3.14.a Arreglado (2). – kennebec

+0

@kennebec Buen punto, edité el título de la pregunta para decir entero en vez de número. –

+0

relacionado, si no está duplicado: [¿Por qué los literales de los números no tienen acceso a los métodos numéricos?] (Http://stackoverflow.com/q/4046342/1048572) – Bergi

Respuesta

16

El período es parte de la serie, por lo que el código se interpreta lo mismo que:

(3.)toFixed(5) 

Esto, naturalmente, dará un error de sintaxis, ya que no puede seguir inmediatamente al 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 entre paréntesis el número:

(3).toFixed(5) 
7

No puede acceder a él debido a un error en el tokenizador de JavaScript. Javascript intenta analizar la notación de puntos en una serie como un literal de coma flotante, por lo que no se puede seguir con una propiedad o método:

2.toString(); // raises SyntaxError

Como usted ha mencionado, hay un par de soluciones que pueden ser utilizado para que los literales numéricos 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 entender más detrás de la utilización de objetos y propiedades, disfrutar de los Javascript Garden.

+4

La mayoría de su respuesta es en realidad repetir cosas que el OP ya dijo . . . – ruakh

+0

Pero explica por qué funciona y que, por ejemplo, no hay ninguna conversión implícita en funcionamiento. –

+0

No creo que "tokenizer" sea la palabra correcta. – georg

3

No funciona porque JavaScript interpreta el 3. como siendo el inicio de una constante de coma flotante (como 3.5) o bien toda una -constante de coma flotante (con 3. == 3.0), por lo que no puede sígalo por un identificador (en tu caso, un nombre de propiedad). No reconoce que pretendía que el 3 y el . fueran dos tokens separados.

Cualquiera de sus soluciones parece estar bien para mí.

+0

+1 ¡tiene sentido por completo! – Meysam

Cuestiones relacionadas