2009-02-27 22 views
9

Po pierwsze - mój opis;)parseInt alternatywa

Mam odpowiedź JSON XmlHttpRequests z serwera. sterownik MySQL wyświetla wszystkie dane jako ciąg i PHP zwraca go, jak to jest, więc każda liczba całkowita jest zwracany jako ciąg, więc:

Czy istnieje szybka alternatywa (Hack) dla parseInt() funkcji w JS, które można analizować czystego numeryczny ciąg, np

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

co z int = string * 1? – dusoft

+0

ładne, działa również na pływaki. – KooiInc

+0

Nie trzeba się mnożyć. Użyj operatora unarnego: int = + string; (Jednak każda liczba w javascriptu wciąż jest zmiennoprzecinkowa (ale myślę, że słyszałem, że V8 może mieć pewne optymalizacje i faktycznie używają int) – some

Odpowiedz

35

Aby przekonwertować na liczbę całkowitą wystarczy użyć operatora jednoargumentowy + powinno być najszybszym sposobem:

var int = +string; 

konwersji do innych typów mogą być wykonane w podobny sposób:

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

More info .

+0

To jest sprytny pomysł, dzięki! Lubię mnożyć dusoft też – shfx

+1

W Chrome, parseInt() jest najszybszy: http://cl.ly/image/442b10002i3T Jeśli bierzesz pod uwagę fakt, że musisz sprawdzić isNaN z parseInt i operator jednoargumentowy, podwójne tyldy jest szybszy niż unary, ale parseInt wciąż wygrywa w Chrome. W IE wygrywa podwójna tylda. Zobacz: http://jsperf.com/double-tilde-vs-parseint/6 –

+0

Dziękuję uratowałem mój dzień – Brent

8

Po pierwsze, czy rzeczywiście udokumentowałeś, że jest wolny i powoduje problemy? W przeciwnym razie nie zawracałbym sobie głowy szukaniem rozwiązania, ponieważ tak naprawdę nie ma problemu.

Po drugie, domyślam się, że skoro parseInt jest natywną metodą JS, byłoby to zaimplementowane w sposób bardzo szybki i prawdopodobnie w języku ojczystym maszyny wirtualnej (prawdopodobnie C, w zależności od przeglądarki/VM). Myślę, że możesz mieć problem z szybszą metodą z czystego JS. =)

Oczywiście, nie jestem guru JS, więc nie wiem na pewno, ale to właśnie podpowiada mi intuicja i zwykle jest standardową odpowiedzią na pytanie "jak mógłbym szybciej alternatywa dla libraryFunction()? " pytania.

+1

Istnieją inne powody, dla których nie należy używać parseInt - porównaj parseInt ("07") do parseInt ("08") –

+2

, który powinieneś używać parseInt ("07", 10) –

2

Konstruktor Ilość również istnieje, ale powinna być taka sama jak parseInt w perspektywie prędkości (jak już wspomniano należy skorygować część PHP zamiast jednego javascript tak):

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

BTW jeśli ktoś jest zainteresowany wyszukiwaniem ciekawości dla implementacji parseInt V8 (Google chrome) i jego wersji here on google code.

+1

upuść "nowy", użyj 'i = Number (i)' zamiast tego otrzymuje prymitywę zamiast obiektu – Christoph

+0

Dokładnie, dodam ją. Dzięki. –

6

oddanych do int w PHP przed wami json_encode() go:

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

Nawiasem mówiąc, podczas korzystania parseInt jest to dobra praktyka, aby zawsze podawać drugiego parametru, chyba że naprawdę chcesz ciąg rozpoczynający się od 0 do być interpretowany jako ósemkowej i tak dalej:

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

To skomplikowane, nie mam dostępu do serwera PHP. – shfx

2

nie będą się lepiej niż parseInt, ale prawdziwy błąd to, że PHP jest zapewnienie tego, co ma być numer jako ciąg znaków.

I zgodnie z tym, co powiedział Daniel - nie szukaj mikro-optymalizacji, dopóki nie porównasz swojego kodu i nie odkryjesz, że warto to zrobić.

0

Jeśli obiekty są większe, można wypróbować JSON, jest to format pisany, więc nie trzeba konwertować wartości.

0

Jak powolny może być? Ile razy na sekundę wywoływany jest ten proces? Ile jest różnych wartości liczbowych? Przygotowałem scenariusz i przetestowałem 100 000 numerów. Parsowanie ich z łańcuchów trwało 687 ms. Przeszukanie ich w tablicy zajęło 541 ms. To bardzo mała poprawa. Zgadzam się z innymi plakatami. Możesz nie osiągnąć lepszej jakości niż natywna metoda parseInt().

12

Rodzaj odlewania w JavaScript odbywa się za pomocą funkcji konstruktora wbudowanych typów bez new, tj

foo.bar = Number(foo.bar); 

Różni się to od parseInt() na kilka sposobów:

  • zer wiodących wygrał 't wyzwolenie trybu ósemkowego
  • wartości zmiennoprzecinkowe będą również przetwarzane
  • cały ciąg jest analizowany, to znaczy jeśli zawiera dodatkowe znaki nienumeryczne, wartość zwracana będzie NaN
0

Casting jest odrobinę szybciej niż podczas analizowania, ale wolniej niż poszukiwania.

Również w Firefoksie najszybszą metodą okazuje się parseInt(), po której następuje wyszukiwanie. Również Firefox okazał się średnio 6 razy szybszy niż IE. Ciekawy.

Fajny pomysł przy użyciu operatora jednoargumentowego. W Firefox, który okazał się być porównywalny do parseInt(). W IE okazało się, że jest to najszybsza metoda.

1

szybki skrót do parseInt jest

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

To co ASM używa do reprezentowania ints w JS.

+0

to jest złe '' 123456789'| 0' -> '1912276171' – Kokizzu

+1

O tak. Sprawiając, że działa ona jak liczba całkowita, daje możliwość przepełnienia liczby całkowitej. –