Co jest lepsze?
Pytam o to tylko po to, żeby zgolić kilka bajtów, ponieważ zamiast liczby (x) mogę użyć + x. Czy parsefloat robi coś lepszego?
javascript
optimization
Namanyay Goel
źródło
źródło
Odpowiedzi:
Różnica między parseFloat i Number
parseFloat
/parseInt
służy do analizowania łańcucha, podczas gdyNumber
/+
służy do przekształcania wartości na liczbę. Zachowują się inaczej. Ale najpierw spójrzmy, gdzie zachowują się tak samo:Tak długo, jak masz standardowe wejście numeryczne, nie ma różnicy. Jeśli jednak dane wejściowe zaczynają się od liczby, a następnie zawierają inne znaki,
parseFloat
obcina liczbę z ciągu, aNumber
dajeNaN
(nie liczbę):Ponadto
Number
rozumie szesnastkowe dane wejściowe, aparseFloat
nie:Ale
Number
działa dziwnie w przypadku pustych ciągów lub ciągów zawierających tylko białe spacje:Ogólnie uważam, że
Number
jest to bardziej rozsądne, więc prawie zawsze używam goNumber
osobiście (a przekonasz się, że korzysta również wiele wewnętrznych funkcji JavaScriptNumber
). Jeśli ktoś pisze'1x'
, wolę pokazać błąd, zamiast traktować go tak, jakby to on wpisał'1'
. Jedyny przypadek, w którym naprawdę robię wyjątek, to sytuacja, gdy konwertuję styl na liczbę, w takim przypadkuparseFloat
jest to pomocne, ponieważ style mają postać podobną do'3px'
, w którym to przypadku chcę porzucić'px'
część i po prostu uzyskać3
, więc uważam, że jest toparseFloat
pomocne tutaj. Ale tak naprawdę to, który z nich wybierzesz, zależy od Ciebie i jakie formy danych wejściowych chcesz zaakceptować.Zauważ, że użycie
+
operatora jednoargumentowego jest dokładnie tym samym, co użycieNumber
jako funkcji:Więc zwykle używam po prostu
+
w skrócie. Tak długo, jak wiesz, co robi, uważam, że jest łatwy do odczytania.źródło
Number()
za "dziwne". Nawet uznałbym je za bardziej oczekiwane, białe znaki to pusta wartość, ale nie są puste / nieokreślone => 0 to niezły wynik. W każdym razie duże (+) dla gablot :)Number('Infinity') === Infinity
podczas gdyparseInt('Infinity') === NaN
+
użyłbym w tym celu (jednoargumentowy plus), ponieważ jeśli zapomnisz średnika w poprzednim wierszu, zamiast tego może zostać obliczone wyrażenie dodające.Różnica polega na tym, co się dzieje, gdy dane wejściowe nie są „prawidłową liczbą”.
Number
zwraca,NaN
podczas gdyparseFloat
analizuje „tyle, ile może”. Jeśli wywoływana na pustym ciąguNumber
zwraca,0
podczas gdy parseFloat zwracaNaN
.Na przykład:
źródło
NaN != NaN
jednak uwagęNaN != NaN
ocena to PRAWDA - dzięki za wskazówkę!isNaN(NaN)
zwracatrue
W tych przykładach widać różnicę:
parseFloat jest nieco wolniejszy, ponieważ wyszukuje pierwsze wystąpienie liczby w ciągu, podczas gdy konstruktor Number tworzy nową instancję liczby z ciągów zawierających wartości liczbowe z białymi znakami lub zawierające wartości fałszywe.
PS Jeśli interesują Cię uniwersalne rozwiązania do konwersji typów, możesz przeczytać wpis o konwersji typów na moim blogu: http://justsimplejs.blogspot.com/2012/08/data-type-conversion.html
źródło
W przypadku pustego ciągu są różne.
+""
iNumber("")
zwraca 0, aparseFloat("")
zwraca NaN.źródło
parseFloat()
ma prawidłowy wynik, ponieważ pusty ciąg NIE jest liczbą0
(czytaj: NaN), podczas gdy łańcuch zawierający znak"0"
JEST0
;+x
zwraca0
nie tylko pusty ciąg, ale także dowolne białe znaki. Przykłady:+" "
,+"\t\t\t"
,+"\n\n"
- wszyscy z nich daje0
w wynikuO ile wiem, a to tylko słyszane przez kolegów, więc może być całkowicie źle poinformowany, że parseFloat jest nieznacznie szybszy.
Chociaż po dalszych badaniach wydaje się, że ta różnica w wydajności zależy od przeglądarki.
http://jsperf.com/parseint-vs-parsefloat/6
Spójrz na te wyniki jsPerf i zadzwoń. (zawiera również testy + x)
Jak zauważono w odpowiedzi @xdazz,
+""
andNumber("")
return0
whileparseFloat("")
zwraca,NaN
więc Znowu skorzystałbym z parseFloat, ponieważ pusty ciąg NIE oznacza liczby 0, tylko ciąg zawierający znak"0"
oznacza 0;źródło
parseFloat()
nadal jest zwycięzcą.