2009-02-27 8 views
9

In primo luogo - la mia descrizione;)parseInt alternativa

Ho una risposta JSON XmlHttpRequests dal server. Il driver MySQL restituisce tutti i dati come stringa e PHP lo restituisce così com'è, quindi qualsiasi numero intero viene restituito come stringa, quindi:

C'è qualche alternativa veloce (hack) per la funzione parseInt() in JS che può analizzare il puro numerico stringa, ad es

var foo = {"bar": "123"}; 
... 
foo.bar = parseInt(foo.bar); // (int) 123 
+1

E int = string * 1? – dusoft

+0

bello, funziona anche per i galleggianti. – KooiInc

+0

Non c'è bisogno di moltiplicare. Utilizza unario operatore: int = + stringa; (Comunque ogni numero in javascript è ancora un float (ma penso di aver sentito che V8 potrebbe avere alcune ottimizzazioni e in realtà utilizzare gli inti) – some

risposta

35

Per convertire un numero intero sufficiente utilizzare l'operatore unario +, dovrebbe essere il modo più veloce:

var int = +string; 

Conversioni ad altri tipi possono essere fatte in modo simile:

var string = otherType + ""; 
var bool = !!anything; 

More info .

+0

Questa è un'idea intelligente, grazie! Mi piace moltiplicare anche Dusoft – shfx

+1

In Chrome, parseInt() è più veloce: http://cl.ly/image/442b10002i3T Se si tiene conto del fatto che è necessario verificare isNaN con parseInt e l'operatore unario, la doppia tilde è più veloce di unario, ma parseInt vince ancora in Chrome. In IE, vince la doppia tilde. Vedere: http://jsperf.com/double-tilde-vs-parseint/6 –

+0

Grazie di aver salvato la mia giornata – Brent

8

Prima di tutto, hai effettivamente documentato che è lento e causa problemi? Altrimenti, non mi preoccuperei di cercare una soluzione, perché non c'è davvero alcun problema.

In secondo luogo, suppongo che poiché parseInt è un metodo JS nativo, sarebbe implementato in un modo molto veloce e probabilmente nella lingua madre della VM (probabilmente C, a seconda del browser/VM). Penso che potresti avere qualche problema a fare un metodo più veloce con JS puro. =)

Ovviamente, non sono un guru del JS, quindi non lo so per certo, ma questo è quello che mi dice il mio intuito e tende a essere la risposta standard a "come farei più veloce alternativa per libraryFunction()? " domande.

+1

Ci sono altri motivi per non utilizzare parseInt - confronta parseInt ("07") per parseInt ("08") –

+2

che sarebbe opportuno utilizzare parseInt ("07", 10) –

2

Il costruttore Numero Esiste anche, ma dovrebbe essere lo stesso di parseInt in termini di velocità (come già detto si dovrebbe correggere la parte PHP al posto di quello javascript in ogni caso):

var i = "123"; 
i = new Number(i); // Number numeric wrapper 
var j = "123"; 
j = Number(j); // Number primitive 

BTW se qualcuno è interessato ho cercato per curiosità per l'implementazione V8 (Google Chrome) di parseInt ed è here on google code.

+1

rilasciare il 'new', utilizzare 'i = Number (i)' invece di ottenere un oggetto primitivo invece di un oggetto – Christoph

+0

Esatto, lo aggiungerò. Grazie. –

6

Fusioni ad un int in PHP voi prima json_encode() che:

$foo->bar = (int)$foo->bar; 
print('var foo = ' . json_encode($foo)); 

Per inciso, quando si utilizza parseInt è buona norma specificare sempre il secondo parametro a meno che non si vuole veramente stringa che inizia con 0 devono essere interpretati come ottale e così via:

parseInt('010', 10); // 10 
+0

È complicato, non ho accesso al server Php. – shfx

2

non si ha intenzione di ottenere meglio di parseInt, ma il vero problema è che il PHP sta fornendo quello che dovrebbe essere un numero come una stringa.

E a proposito di ciò che Daniel ha detto: non andare alla ricerca di micro-ottimizzazioni come questa fino a quando non avrai confrontato il tuo codice e scoperto che vale la pena farlo.

0

se gli oggetti sono più grandi, è possibile provare JSON, è un formato digitato in modo da non dover convertire i valori.

0

Quanto può essere lento? Quante volte al secondo viene chiamato questo processo? Quanti valori di ritorno numerici diversi ci sono? Ho montato una sceneggiatura e ho testato 100.000 numeri. Parsing li da stringhe ha preso 687 ms. La ricerca in un array ha richiesto 541 ms. Questo è un miglioramento molto piccolo. Sono d'accordo con altri poster. Potresti non essere migliore del metodo nativo parseInt().

12

Tipo colata in JavaScript viene fatto tramite le funzioni di costruzione del tipi incorporati senza new, cioè

foo.bar = Number(foo.bar); 

Ciò differisce da parseInt() in diversi modi:

  • zeri vinto Attiva la modalità ottale
  • i valori a virgola mobile verranno analizzati anche
  • l'intera stringa viene analizzato, cioè se contiene caratteri non numerici aggiuntivi, il valore restituito sarà NaN
0

Casting è un pochino più veloce di parsing ma più lento rispetto alla ricerca.

Inoltre, in Firefox il metodo più veloce risulta essere parseInt() seguito dalla ricerca. Anche Firefox è risultato in media 6 volte più veloce di IE. Interessante.

Cool idea utilizzando l'operatore unario. In Firefox si è rivelato paragonabile a parseInt(). In IE si è rivelato il metodo più veloce.

1

collegamento veloce al parseInt è

("78.5" | 0) //bitwise or forces the string to parse as int 

Questo è ciò che ASM utilizza per rappresentare interi in js.

+0

questo è male ''1234567890123' | 0' -> ' 1912276171' – Kokizzu

+1

Oh sì. Rendendolo funzionare come un intero ti dà la possibilità di overflow di interi. –