2013-04-07 10 views
14

Ho visto spesso il truccoCoerce al numero

after = +after; 

di costringere la variabile after ad un numero. Leggendo il Node.JS source ho trovato un altro metodo:

after *= 1; // coalesce to number or NaN 

sono i due metodi rigorosamente equivalenti nel loro comportamento?

risposta

5

Dopo un rapido google to make sure my suspicions were true, sono arrivato a questa conclusione. L'utilizzo dell'operatore + per la conversione in un numero è più veloce, poiché non si verificano operazioni matematiche dopo il cast di tipi, mentre l'utilizzo dell'approccio *= significa che dopo la conversione after, verrà moltiplicato per 1.

+0

Quindi non ci sono differenze comportamentali, solo velocità e sintassi? – Randomblue

+0

Non sono un esperto, ma la domanda relativa alla sintassi data, che credo abbia risposto. Se il casting è diverso a seconda dell'operatore, non lo so. Ciò richiederebbe un geek con poteri ben oltre i miei! – christopher

1

Nota: In alcuni casi after = after-0 invoca un comportamento diverso rispetto after = after+0. L'ho notato con le date.

Questo è testato in Chrome V39 solo:

var date = new Date(2000,0,1); 
date += date; //"Sat Jan 01 2000 00:00:00 GMT+0000 (GMT Standard Time)Sat Jan 01 2000 00:00:00 GMT+0000 (GMT Standard Time)" 
var date2 = new Date(2000,0,1); 
date2 + 0; //"Sat Jan 01 2000 00:00:00 GMT+0000 (GMT Standard Time)0" 
date2 - 0; //946684800000 
date2 * 1; //946684800000 

Non so quello che viene definito nelle specifiche JS, ma con date, perché sia ​​la data e il numero può essere lanciato in una stringa, e l'operatore + lavora su una stringa, quindi Chrome va con una concatenazione di stringhe. Poiché l'operatore - non ha equivalenti in termini di stringa, torna al confronto dei numeri.

ho trovato questo utile quando costringere date in numeri per i confronti

0

Sì, però notare che è solo il unario + operatore che fa questo. Cioè 10 + "10" ti darà "1010".

Un'opzione forse meno inclini errore è quello di utilizzare ciò asm.js fa:

10 + ("10"|0) 

Anche se sul rovescio della medaglia si richiede le staffe. Dovrebbe essere l'opzione più veloce in ogni caso (probabilmente uguale a + unario).

+3

Questo convertirà il numero in un numero intero, non solo in un numero (es .: '(" 10.7 "| 0) === 10'). Se vuoi solo convertire la stringa in un numero, usa unary plus ('+" 10.7 "=== 10.7') – Jack

Problemi correlati