2012-10-11 22 views
8

Escribí un método de extensión simple.¿Cuál es la diferencia entre 987 y (987) en JavaScript?

Number.prototype.toMillion = function(){ 
if(!Number.isNaN){ 
    return this/1000000; 
} 
} 

987654321.toMillion() plantea:

SyntaxError: Unexpected token ILLEGAL

Pero (987654321).toMillion() obras.

Así que mi pregunta es: ¿cuál es la diferencia entre 987 y (987)?

Para su información:

typeof(987) => returns "number" 

Y

typeof((987)) still returns "number" 
+2

¿A quién está marcando 'Number.isNaN'? ¿Te refieres a 'this.isNaN()'? – David

+0

Además de las respuestas a continuación, revise: '987654321..toMillion()' – Izkata

+1

@David - Simplemente sería 'isNaN (this)' (es una función global, no una propiedad de 'Number.prototype'). –

Respuesta

11

Cómo sabría el analizador que la parte siguiente del carácter . está destinado a significar una llamada de método en lugar de otra parte de la serie? Por ejemplo:

10.1 // This is a number with a floating point 
10.toMillion() //How does it know that this shouldn't be part of the number? 

Por esa razón, no puede llamar a métodos en literales numéricos. Al colocar el literal entre paréntesis (el grouping operator), el tiempo de ejecución evaluará la expresión contenida y aplicará el método al resultado de esa evaluación. El operador de agrupación elimina la ambigüedad del carácter ..


actualización

Después de pensar un poco y un poco de investigación a través de la especificación, hay una buena razón para no permitir el uso de una búsqueda hacia delante para determinar si lo que sigue el carácter . es parte de la serie o un identificador de propiedad.

Como @ CygnusX1 mencionó en los comentarios, habría pensado que las dos situaciones (. seguidas de un dígito y . seguidas por un carácter no numérico) podrían diferenciarse mediante el uso de un seguimiento. Como los identificadores no pueden comenzar con un número, si un carácter numérico sigue al ., tiene que ser un número. Si un carácter no numérico sigue al ., no puede ser parte del número. Pero eso no está del todo bien.

Hay una situación en la que un carácter no numérico puede seguir el carácter ., pero aún así ser parte de la serie:

console.log(1.e5); // Logs '100000' 

El e indica que lo que sigue es la exponente, y puede ya sea en minúscula o mayúscula. Por esta razón, el uso de un vistazo debería tener en cuenta que si el carácter que sigue al . es e o E, aún podría representar un método o parte del número. Es más fácil simplemente no permitir el uso de propiedades en literales numéricos.

+0

Me lo ganaste;) –

+0

El analizador podría decidirlo mirando hacia delante. Si el elemento después del punto es un identificador, entonces el punto no debe ser parte del número. Sin embargo, según el ejemplo de Torsten Walter, dado que los miembros pueden ser números en sí mismos, esto ya no es posible. – CygnusX1

+0

@ CygnusX1 - El segundo ejemplo de Torsten es un error de sintaxis. No puede definir propiedades numéricas como esa (ya que los identificadores no pueden comenzar con un número). –

5

El . está sobrecargado en JavaScript.

123.123   // the interpreter assumes this is a floating point number 
(123).123  // throws a syntax error, since an identifier 
       // can't start with a number. - thanks James for pointing that out 
(123).toMillion // refers to the function of the object returned by 
       // the statement in braces 
123.toMillion // will throw a syntax error because a floating point number has only digits 
+1

Tenga en cuenta que su segundo ejemplo realmente arroja un error de sintaxis, ya que un identificador no puede comenzar con un número. –

1

al analizar 987654321.toMillion() "período" se interpreta como un delimitador de la fracción. Entonces, si quieres usar el número como objeto, debes envolverlo con llaves.

Cuestiones relacionadas