2012-10-11 16 views
8

Ho scritto un metodo di estensione semplice.Qual è la differenza tra 987 e (987) in JavaScript?

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

987654321.toMillion() solleva:

SyntaxError: Unexpected token ILLEGAL

Ma (987654321).toMillion() opere.

Quindi la mia domanda è: qual è la differenza tra 987 e (987)?

Cordiali saluti:

typeof(987) => returns "number" 

E

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

Whya stai selezionando 'Number.isNaN'? Intendi 'this.isNaN()'? – David

+0

Oltre alle risposte sottostanti, consulta: '987654321..toMillion()' – Izkata

+1

@David - Sarebbe semplicemente 'isNaN (this)' (è una funzione globale, non una proprietà di 'Number.prototype'). –

risposta

11

Come sarebbe il parser sapere che la parte che segue il carattere . ha lo scopo di indicare una chiamata al metodo al posto di un'altra parte del numero? Per esempio:

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? 

Per questo motivo, non è possibile chiamare metodi su letterali numerici. Inserendo il letterale tra parentesi (grouping operator), il runtime valuterà l'espressione contenuta e applicherà il metodo al risultato di tale valutazione.

L'operatore di raggruppamento rimuove l'ambiguità del carattere ..


Aggiornamento

Dopo qualche pensiero e qualche indagine attraverso le specifiche, v'è un buon motivo per non consentire l'uso di un lookahead per determinare se quanto segue il carattere . fa parte del numero o un identificatore di proprietà.

Come @ CygnusX1 menzionato nei commenti, si avrebbe comunque che le due situazioni (. seguite da una cifra e . seguite da un carattere non numerico) potrebbero essere differenziate mediante l'uso di un lookahead. Poiché gli identificatori non possono iniziare con un numero, se un carattere numerico segue lo ., deve essere un numero. Se un carattere non numerico segue lo ., non può far parte del numero. Ma non è giusto.

V'è una situazione in cui un carattere non numerico può seguire il carattere . ma essere ancora parte del numero:

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

Il e indica che ciò che segue è la esponente, e può essere minuscolo o maiuscolo. Per questo motivo, l'utilizzo di un lookahead dovrebbe tenere conto del fatto che se il carattere che segue lo . è e o E, potrebbe comunque rappresentare un metodo o parte del numero. È più semplice non consentire l'utilizzo di proprietà su valori letterali numerici.

+0

Mi hai battuto su di esso;) –

+0

Il parser potrebbe decidere con un look-ahead. Se l'elemento dopo il punto è un identificatore, allora il punto non dovrebbe essere una parte del numero. Tuttavia, come per l'esempio di Torsten Walter, poiché i membri possono essere i numeri stessi, questo non è più possibile. – CygnusX1

+0

@ CygnusX1 - Il secondo esempio di Torsten è un errore di sintassi. Non è possibile definire proprietà numeriche come quella (dato che gli identificatori non possono iniziare con un numero). –

5

Il . è sovraccarico in 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

Nota che il tuo secondo esempio genera effettivamente un errore di sintassi, poiché un identificatore non può iniziare con un numero. –

1

Quando 987654321.toMillion() viene analizzato "periodo" viene interpretato come delimitatore della frazione. Quindi se vuoi usare il numero come oggetto devi avvolgerlo con le parentesi graffe.

Problemi correlati