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.
¿A quién está marcando 'Number.isNaN'? ¿Te refieres a 'this.isNaN()'? – David
Además de las respuestas a continuación, revise: '987654321..toMillion()' – Izkata
@David - Simplemente sería 'isNaN (this)' (es una función global, no una propiedad de 'Number.prototype'). –