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?
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?
Odpowiedzi:
parseFloat
/ parseInt
służy do analizowania łańcucha, podczas gdy Number
/ +
służy do przekształcania wartości na liczbę. Zachowują się inaczej. Ale najpierw spójrzmy, gdzie zachowują się tak samo:
parseFloat('3'); // => 3
Number('3'); // => 3
parseFloat('1.501'); // => 1.501
Number('1.501'); // => 1.501
parseFloat('1e10'); // => 10000000000
Number('1e10'); // => 10000000000
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, a Number
daje NaN
(nie liczbę):
parseFloat('1x'); // => 1
Number('1x'); // => NaN
Ponadto Number
rozumie szesnastkowe dane wejściowe, a parseFloat
nie:
parseFloat('0x10'); // => 0
Number('0x10'); // => 16
Ale Number
działa dziwnie w przypadku pustych ciągów lub ciągów zawierających tylko białe spacje:
parseFloat(''); // => NaN
Number(''); // => 0
parseFloat(' \r\n\t'); // => NaN
Number(' \r\n\t'); // => 0
Ogólnie uważam, że Number
jest to bardziej rozsądne, więc prawie zawsze używam go Number
osobiście (a przekonasz się, że korzysta również wiele wewnętrznych funkcji JavaScript Number
). 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 przypadku parseFloat
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 to parseFloat
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życie Number
jako funkcji:
Number('0x10'); // => 16
+'0x10'; // => 16
Number('10x'); // => NaN
+'10x'; // => NaN
Number('40'); // => 40
+'40'; // => 40
Więc zwykle używam po prostu +
w skrócie. Tak długo, jak wiesz, co robi, uważam, że jest łatwy do odczytania.
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 gdy parseFloat
analizuje „tyle, ile może”. Jeśli wywoływana na pustym ciągu Number
zwraca, 0
podczas gdy parseFloat zwraca NaN
.
Na przykład:
Number("") === 0 // also holds for false
isNaN(parseFloat("")) === true // and null
isNaN(Number("32f")) === true
parseFloat("32f") === 32
NaN != NaN
jednak uwagę
NaN != NaN
ocena to PRAWDA - dzięki za wskazówkę!
isNaN(NaN)
zwracatrue
W tych przykładach widać różnicę:
Number('') = 0;
Number(false) = 0;
Number('1a') = NaN;
parseFloat('') = NaN;
parseFloat(false) = NaN;
parseFloat('1a') = 1;
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
W przypadku pustego ciągu są różne.
+""
i Number("")
zwraca 0, a parseFloat("")
zwraca NaN.
parseFloat()
ma prawidłowy wynik, ponieważ pusty ciąg NIE jest liczbą 0
(czytaj: NaN), podczas gdy łańcuch zawierający znak "0"
JEST 0
;
+x
zwraca 0
nie tylko pusty ciąg, ale także dowolne białe znaki. Przykłady: +" "
, +"\t\t\t"
, +"\n\n"
- wszyscy z nich daje 0
w wyniku
O 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, +""
and Number("")
return 0
while parseFloat("")
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;
parseFloat()
nadal jest zwycięzcą.