Jakie są różnice między tą linią:
var a = parseInt("1", 10); // a === 1
i ta linia
var a = +"1"; // a === 1
Ten test jsperf pokazuje, że jednoargumentowy operator jest znacznie szybszy w aktualnej wersji Chrome, zakładając, że jest to dla node.js !?
Jeśli spróbuję przekonwertować ciągi, które nie są liczbami, oba zwracają NaN
:
var b = parseInt("test" 10); // b === NaN
var b = +"test"; // b === NaN
Więc kiedy powinienem wolę używać parseInt
zamiast jednoargumentowego plusa (szczególnie w node.js) ???
edycja : i jaka jest różnica w stosunku do operatora podwójnej tyldy ~~
?
javascript
node.js
tutaj i teraz 78
źródło
źródło
Odpowiedzi:
Zapoznaj się z tą odpowiedzią, aby zapoznać się z pełniejszym zestawem przypadków
Cóż, oto kilka różnic, o których wiem:
Pusty ciąg
""
szacuje się na a0
, podczas gdyparseInt
szacuje go naNaN
. IMO, pusty ciąg powinien byćNaN
.Jednoargumentowy
+
działa bardziej jak,parseFloat
ponieważ akceptuje również liczby dziesiętne.parseInt
z drugiej strony przestaje analizować, gdy widzi znak nienumeryczny, taki jak kropka, która ma być kropką dziesiętną.
.parseInt
iparseFloat
analizuje i buduje ciąg od lewej do prawej . Jeśli zobaczą nieprawidłowy znak, zwraca to, co zostało przeanalizowane (jeśli istnieje) jako liczbę, aNaN
jeśli żaden nie został przeanalizowany jako liczba.Z
+
drugiej strony jednoargumentowy zwróci wartość,NaN
jeśli cały ciąg nie jest konwertowany na liczbę.Jak widać w komentarzu @Alex K. ,
parseInt
iparseFloat
przeanalizuje po znaku. Oznacza to, że notacje szesnastkowe i wykładniki nie będą działać, ponieważx
ie
są traktowane jako komponenty nienumeryczne (przynajmniej na podstawie 10).Jednak jednoargumentowy
+
konwertuje je poprawnie.źródło
+"0xf" != parseInt("0xf", 10)
Math.floor()
, który w zasadzie odcina część dziesiętną."2e3"
nie jest prawidłową reprezentacją liczby całkowitej dla2000
. Jest to jednak poprawna liczba zmiennoprzecinkowa:parseFloat("2e3")
poprawnie ustąpi2000
jako odpowiedź. I"0xf"
wymaga co najmniej podstawy 16, dlategoparseInt("0xf", 10)
zwraca0
, podczas gdyparseInt("0xf", 16)
zwraca oczekiwaną wartość 15.Math.floor(-3.5) == -4
i~~-3.5 == -3
.Ostateczna tabela konwersji cokolwiek na liczby:
Pokaż fragment kodu
źródło
"NaN"
do tej tabeli.isNaN
kolumnę do tej tabeli: na przykładisNaN("")
jest fałszywa (czyli jest uważana za liczbę), aleparseFloat("")
jestNaN
, co może być problemem, jeśli próbujesz użyćisNaN
do walidacji danych wejściowych przed przekazaniem ich doparseFloat
'{valueOf: function(){return 42}, toString: function(){return "56"}}'
do listy. Mieszane wyniki są interesujące.+
to po prostu krótszy sposób pisaniaNumber
, a te bardziej szalone to po prostu szalone sposoby, które zawodzą w skrajnych przypadkach?Uważam, że tabela w odpowiedzi thg435 jest wyczerpująca, jednak możemy podsumować następujące wzorce:
true
do 1, ale"true"
doNaN
.parseInt
jest bardziej liberalny dla łańcuchów, które nie są czystymi cyframi.parseInt('123abc') === 123
, mając na uwadze, że+
raportyNaN
.Number
zaakceptuje prawidłowe liczby dziesiętne, aparseInt
po prostu zrzuci wszystko poza przecinek. W ten sposóbparseInt
naśladuje zachowanie języka C, ale być może nie jest idealny do oceny danych wejściowych użytkownika.parseInt
będąc źle zaprojektowanym parserem , akceptuje dane wejściowe ósemkowe i szesnastkowe. Jednoargumentowy plus przyjmuje tylko szesnastkowe.Fałszywe wartości są konwertowane na
Number
następujące, co miałoby sens w C:null
ifalse
obie wynoszą zero.""
przejście do 0 nie do końca jest zgodne z tą konwencją, ale ma dla mnie wystarczająco dużo sensu.Dlatego myślę, że jeśli sprawdzasz dane wejściowe użytkownika, unary plus ma poprawne zachowanie dla wszystkiego, z wyjątkiem tego, że akceptuje liczby dziesiętne (ale w moich prawdziwych przypadkach bardziej interesuje mnie przechwytywanie danych wejściowych e-mail zamiast identyfikatora użytkownika, wartość całkowicie pominięta itp.), Podczas gdy parseInt jest zbyt liberalne.
źródło
Uważaj, parseInt jest szybsze niż operator + jednoargumentowy w Node.JS, nieprawdą jest, że + lub | 0 są szybsze, są szybsze tylko dla elementów NaN.
Sprawdź to:
źródło
Weź pod uwagę również wydajność . Zaskoczyło mnie, że
parseInt
na iOS bije unary plus :) Jest to przydatne tylko w przypadku aplikacji internetowych z dużym obciążeniem procesora. Zgodnie z ogólną zasadą sugerowałbym opt-facetom JS, aby rozważył dowolnego operatora JS zamiast innego z punktu widzenia wydajności mobilnej w dzisiejszych czasach.Więc idź najpierw na urządzenia mobilne ;)
źródło