Czy możliwe jest jakoś zwrócić 0 zamiast NaN
podczas analizowania wartości w JavaScript?
W przypadku pustego ciągu parseInt
zwraca NaN
.
Czy w JavaScript można zrobić coś takiego NaN
?
var value = parseInt(tbb) == NaN ? 0 : parseInt(tbb)
A może istnieje inna funkcja lub wtyczka jQuery, która może zrobić coś podobnego?
javascript
nan
Joper
źródło
źródło
NaN != NaN
. Że trzebaisNaN(value)
.parseInt()
Dwukrotne wywołanie funkcji (w udanym / normalnymNaN
przypadku innym niż przypadku) nigdy nie jest dobrym pomysłem. Poza nieefektywnością, dla nieostrożnych, jeśli cokolwiek zostanie pominięte,tbb
jest wywołanie funkcji z efektami ubocznymi, jest straszne. Nie użyłbym tutaj żadnego rozwiązania, w którym widzęparseInt()
dwa razy.Odpowiedzi:
Gdy nie jest używany z wartościami logicznymi,
||
operator logiczny OR ( ) zwraca pierwsze wyrażenie (parseInt(s)
), jeśli można je oszacować jako prawda, w przeciwnym razie zwraca drugie wyrażenie (0). Zwracana wartośćparseInt('')
to NaN. NaN ocenia się na false, więcnum
ostatecznie zostaje ustawiony na 0.źródło
0
zamiastNaN
. Jest to doskonale rozwiązane przez kod Matta.var nextIphone = parseInt("4S") + 1; // wow it works!
Możesz także użyć
isNaN()
funkcji:źródło
parseInt(s)
dwa razy? Ponadto powinno byćparseInt(s, 10)
parseInt()
jednak dwukrotnie dzwonić .Byłem zaskoczony, gdy nikt nie wspomniał o używaniu
Number()
. To prawda, że parsuje ułamki dziesiętne, jeśli są podane, więc będzie działał inaczej niżparseInt()
, jednak już zakłada podstawową 10 i zmieni „” lub nawet „” na 0.źródło
Dla osób, które nie są ograniczone
parseInt
, możesz użyć bitowego operatora OR (który domyślnie wywołujeToInt32
jego operandy).Uwaga:
ToInt32
różni się odparseInt
. (tj.parseInt('33Ab') === 33
)źródło
'10000000000' | 0 === 1410065408
.Math.pow(2, 31)
przepełni się.Problem
Inne odpowiedzi nie biorą pod uwagę, że
0
jest to fałsz, a zatem następujące będą wynosić 20 zamiast 0:Rozwiązanie
Proponuję funkcję pomocnika, która rozwiązuje większość problemów:
Funkcja pomocnika da następujące wyniki:
źródło
parseInt(string, radix)
rozważ to: MożeparseInt("0x10") === 16
takżeparseInt("010")
ustąpić8
w niektórych przeglądarkachdefaultTo
funkcja, która robi to:_.defaultTo(NaN, -1)
zwraca-1
, ale_.defaultTo(0, -1);
zwraca0
.parseInt
dwa razyCzy praca jest dużo czystsza niż parsowanie Moim zdaniem użyj operatora +
źródło
źródło
Wykonaj osobne sprawdzenie pustego łańcucha (ponieważ jest to jeden konkretny przypadek) i w tym przypadku ustaw go na zero.
Możesz poprosić „0” na początek, ale musisz dodać przedrostek, aby wskazać, że jest to liczba dziesiętna, a nie ósemkowa
źródło
Dlaczego nie zastąpić funkcji? W takim przypadku zawsze możesz mieć pewność, że zwróci
0
w przypadkuNaN
:Teraz w dowolnym miejscu kodu:
źródło
|| 0
jak w odpowiedzi Matta. Widzę, że nadrzędne obiekty, których nie posiadasz w ostateczności, lub ich brak kosztowałyby znacznie więcej pod względem czasu i złożoności.Miałem podobny problem (Firefox V34) z prostymi ciągami, takimi jak:
Więc wymyśliłem szybki hack:
A potem wszystko głupio skomplikowało zajmowanie się floatami + intami dla nie-prostych rzeczy:
Zwróci 0 za rzeczy takie jak:
źródło
źródło
||
podejścia. Wiem, że to stare pytanie i odpowiedź, ale ta odpowiedź pozwala uniknąć dwukrotnego wywołania parsowania i poprawnie używa isNaN. Po prostu potrzebuje podstawki,parseInt(x, 10)
aby być dokładnym. (Moje preferencje to osobna zmienna wewnętrzna zamiast ponownego użyciax
).Stworzyłem 2 prototyp, aby sobie z tym poradzić, jeden dla liczby, a drugi dla ciągu.
Jeśli nie chcesz korzystać z kontroli bezpieczeństwa, użyj
Przykładowe użycie:
źródło
Wyjaśnienie dla tych, którzy nie uważają tego za trywialne:
Mnożenie przez jeden, metoda nazywana „rzutowaniem niejawnym”, próbuje przekształcić operand nieznanego typu w pierwotny typ „liczba”. W szczególności pusty ciąg stałby się liczbą 0, co czyni go odpowiednim typem dla parseInt () ...
Bardzo dobry przykład podał także powyżej PirateApp, który zasugerował, aby wstawić znak +, zmuszając JavaScript do użycia rzutowania niejawnego Number.
źródło
parseInt('str'*1)
parseInt
na coś, co już jest numerem? Spowoduje to kolejną konwersję z powrotem na ciąg znaków, aby ponownie przekonwertować ją na liczbę.Również w ten sposób, dlaczego nie napisać funkcji i wywołać ją tam, gdzie jest to wymagane. Zakładam, że jest to wpis w polach formularza w celu wykonania obliczeń.
co jest nie tak robiąc?
źródło
NaN
.Oto metoda tryParseInt, której używam, która przyjmuje wartość domyślną jako drugi parametr, dzięki czemu może być wszystkim, czego potrzebujesz.
źródło
funkcja pomocnicza, która nadal pozwala na korzystanie z podstawki
źródło
Możesz mieć bardzo czysty kod, miałem podobne problemy i rozwiązałem go za pomocą:
źródło
Dla innych osób szukających tego rozwiązania wystarczy użyć: ~~ bez analizy, jest to najczystszy tryb.
Jeśli NaN, zwróci 0 zamiast tego.
źródło