2012-05-02 19 views
5

Da quando ho iniziato a lavorare con JS, ho pensato che l'unico modo per richiamare una funzione su un numero letterale è di metterlo in posizione espressione avvolgendolo con parentesi, in questo modo:Quali sono le regole per richiamare le funzioni sui numeri letterali in JS?

1.toString(); 
// SyntaxError: identifier starts immediately after numeric literal 

(1).toString(); 
// "1" 

Oggi, mi è venuto in mente di provare questo:

0.1.toString(); 
// "0.1" 

Perché funziona? Un puntatore alle specifiche ufficiali sarebbe fantastico.

Modifica L'ambiguità è stato il mio primo pensiero, ma poi ho deciso che non c'è ambiguità neanche nello 1.toString(). È più profondo di quanto pensassi, ma continuo a pensare che abbia ragione. Ecco perché:

nomi delle proprietà può cominciare con cifre

var obj = { "1" : 1, "2" : 2 }; 

nomi delle proprietà che iniziano con le cifre possono essere referenziati soltanto con parentesi quadre

obj.1; 
// SyntaxError: Unexpected token ILLEGAL 
obj['1']; 
// 1 

anche:

1['toString'](); 
// '1' 

Pertanto, 1. seguito da qualsiasi non cifra sarà sempre una chiamata al metodo o accesso alla proprietà, mai un numero decimale. Allo stesso modo, 1. seguito da qualsiasi cifra sarà sempre un numero decimale, mai una chiamata al metodo o accesso alla proprietà.

+1

come nota, è possibile utilizzare '1..toString()', il primo '.' indica il punto decimale, il secondo indica l'utilizzo per la funzione. – zzzzBov

+1

Correlati: http://stackoverflow.com/q/2300197 – CMS

+0

Intelligente, grazie a zzzzBov e CMS. – mwcz

risposta

5

Una volta che è visto il primo . in 0.1, poi un successivo .non può essere parte del numero.

È tutta una questione di ambiguità.

modificare — sezione 7.8.3 della specifica insiste esplicitamente su questo:

Il carattere di origine immediatamente dopo un NumericLiteral non deve essere un IdentifierStart o DecimalDigit.

non sono sicuro esattamente quello che sta cercando di evitare che, ma il lexer JavaScript è piuttosto nodoso, soprattutto grazie alla grammatica letterale regex e la necessità di uno strano parser-lexer incidere a che fare con questo.

+0

Non penso ci sia alcuna ambiguità qui. Aggiornamento della mia domanda con il ragionamento. Sono confuso da quella frase dalla specifica ... '0.1.toString()' è valido, ma mi sembra un NumericLiteral immediatamente seguito da un DecimalDigit. – mwcz

+0

@mwcz Sì, sono d'accordo sul fatto che non ci sia * apparente * ambiguità, ma potrebbe esserci qualche motivo oscuro per l'insistenza che il caso sia trattato come un errore. Le specifiche non entrano in nessun dettaglio reale. E '0.1.toString' è * non * un letterale numerico seguito da una cifra decimale: è un valore letterale numerico seguito da un carattere' .', che non è né una cifra decimale né un identificatore iniziale. – Pointy

+0

Ah, grazie. Ho guardato a '.' e non riuscivo a distinguerlo da' .' :) Ho aggiunto il ragionamento contro l'ambiguità, anche se suppongo che tu sia arrivato in modo indipendente. – mwcz

Problemi correlati