Desde que empecé a trabajar con JS, he pensado en la única manera de invocar una función de un número literal es para ponerlo en posición de expresión envolviéndolo con parens, así:¿Cuáles son las reglas para invocar funciones en los literales de números en JS?
1.toString();
// SyntaxError: identifier starts immediately after numeric literal
(1).toString();
// "1"
Hoy en día, se me ocurrió intentar esto:
0.1.toString();
// "0.1"
¿Por qué funciona esto? Un puntero a la especificación oficial sería genial.
Editar ambigüedad fue lo primero que pensé, pero luego decidió que no hay ambigüedad en 1.toString()
tampoco. Es más profundo de lo que pensé en un principio, pero todavía creo que estoy en lo cierto. He aquí por qué:
Los nombres de propiedades puede comenzar con dígitos
var obj = { "1" : 1, "2" : 2 };
nombres de propiedad que comiencen con los dígitos sólo pueden ser referenciados con corchetes
obj.1;
// SyntaxError: Unexpected token ILLEGAL
obj['1'];
// 1
también:
1['toString']();
// '1'
Por lo tanto, 1.
seguido de cualquier dígito no siempre será una llamada al método o acceso a la propiedad, nunca un número decimal. Del mismo modo, 1.
seguido de cualquier dígito siempre será un número decimal, nunca un método de llamada o acceso a la propiedad.
Como nota, puede usar '1..toString()', el primer '.' indica el punto decimal, el segundo indica el uso de la función. – zzzzBov
Relacionado: http://stackoverflow.com/q/2300197 – CMS
Clever, gracias zzzzBov y CMS. – mwcz