Czy istnieje sposób na konwersję wartości NaN na 0 bez instrukcji if:
if (isNaN(a)) a = 0;
Sprawdzanie moich zmiennych za każdym razem jest bardzo denerwujące.
javascript
Tamás Pap
źródło
źródło
function noNaN( n ) { return isNaN( n ) ? 0 : n; }
a potem tylkonoNaN( a )
Odpowiedzi:
Możesz to zrobić:
... który zamieni dowolną wartość „falsey” na
0
.Wartości „falsey” to:
false
null
undefined
0
""
( pusta struna )NaN
(Nie liczba)Lub to jeśli wolisz:
... które będą miały taki sam efekt jak powyżej.
Jeśli celem było przetestowanie czegoś więcej niż tylko
NaN
, możesz zrobić to samo, ale najpierw wykonać konwersję do liczby .To używa operatora unary +, aby spróbować przekonwertować
a
na liczbę. Ma to tę dodatkową zaletę, że konwertuje takie rzeczy, jak ciągi liczbowe'123'
na liczbę.Jedyną nieoczekiwaną rzeczą może być sytuacja, gdy ktoś przejdzie przez tablicę, którą można z powodzeniem przekonwertować na liczbę:
Tutaj mamy tablicę, która ma pojedynczy element, który jest ciągiem liczbowym. Zostanie pomyślnie przekonwertowany na liczbę.
źródło
NaN
wartości. To nie zadziała jako test dla wszystkich wartości nieliczbowych. Chociaż moglibyśmy najpierw spróbować wykonać konwersję liczby. Zaktualizuję.Używanie podwójnej tyldy (podwójnie bitowe NIE) -
~~
- robi kilka interesujących rzeczy w JavaScript. Na przykład możesz użyć go zamiastMath.floor
lub nawet jako alternatywy dlaparseInt("123", 10)
! Dużo się o tym mówi w Internecie, więc nie będę się zastanawiał, dlaczego tu działa, ale jeśli jesteś zainteresowany: co to jest operator „podwójnej tyldy” (~~) w JavaScript?Możemy wykorzystać tę właściwość podwójnej tyldy do konwersji
NaN
na liczbę i na szczęście ta liczba wynosi zero!console.log(~~NaN); // 0
źródło
~~
w ogóle, po prostu stosować go wraz z bokuparseFloat()
tak:~~parseFloat($variable);
. Bardzo schludnie :) +1Napisz własną metodę i używaj jej wszędzie tam, gdzie chcesz wartość liczbową:
źródło
null
to nie da mi oczekiwanego rezultatu0
. Więcej o moim punkcie tutaj: stackoverflow.com/questions/115548/why-is-isnannull-false-in-jsNumber(val)
na tym, że powraca,0
gdy i tak nie może tego zrozumieć.Coś prostszego i skutecznego na wszystko:
... który zamieni dowolną wartość „falsey” na
0
.Wartości „falsey” to:
false
null
undefined
0
""
( pusta struna )NaN
(Nie liczba)źródło
Zamiast kludować, aby móc kontynuować, dlaczego nie wykonać kopii zapasowej i zastanawiać się, dlaczego w ogóle napotykasz NaN?
Jeśli którykolwiek z numerycznych danych wejściowych operacji jest NaN, wyjście będzie również NaN. Tak właśnie działa obecny standard zmiennoprzecinkowy IEEE (to nie tylko Javascript). Takie zachowanie jest nie bez powodu : podstawową intencją jest powstrzymanie cię od wykorzystywania fałszywego wyniku bez uświadomienia sobie, że jest fałszywy.
Sposób działania NaN polega na tym, że jeśli coś pójdzie nie tak w niektórych poddziałaniach podrzędnych (wytwarzając NaN na tym niższym poziomie), końcowym wynikiem będzie również NaN, który natychmiast rozpoznasz jako błąd, nawet jeśli twój logika obsługi błędów (może rzucać / łapać?) nie jest jeszcze ukończona.
NaN jako wynik obliczeń arytmetycznych zawsze wskazuje, że coś poszło nie tak w szczegółach arytmetyki. W ten sposób komputer może powiedzieć „potrzebne jest tutaj debugowanie”. Zamiast znaleźć sposób na kontynuację z jakąś liczbą, która prawie nigdy nie jest poprawna (czy 0 naprawdę jest tym, czego chcesz?), Dlaczego nie znaleźć problemu i go naprawić.
Częstym problemem jest to, że zarówno JavaScript
parseInt(...)
iparseFloat(...)
zwróci NaN jeśli otrzymują bezsensowny argument (null
,''
itp). Napraw problem na najniższym możliwym poziomie, a nie na wyższym poziomie. Zatem wynik ogólnego obliczenia ma dużą szansę na sens i nie zastępujesz żadnej magicznej liczby (0 lub 1 lub cokolwiek innego) wynikiem całego obliczenia. (Sztuczka (parseInt (foo.value) || 0) działa tylko w przypadku sum, a nie produktów - w przypadku produktów, których wartość domyślna ma wynosić 1, a nie 0, ale nie, jeśli podana wartość naprawdę wynosi 0.)Być może dla ułatwienia kodowania chcesz, aby funkcja pobierała wartość od użytkownika, czyściła ją i, w razie potrzeby, podała wartość domyślną:
źródło
Co powiesz na regex ?
Poniższy kod zignoruje NaN, aby umożliwić obliczenie poprawnie wprowadzonych liczb
Pokaż fragment kodu
źródło
Metody, które używają isNaN, nie działają, jeśli próbujesz użyć parseInt, na przykład:
Ale w drugim przypadku isNaN produkuje fałsz (tzn. Ciąg zerowy jest liczbą)
Podsumowując, łańcuch zerowy jest uważany za prawidłową liczbę przez isNaN, ale nie przez parseInt. Sprawdzone w Safari, Firefox i Chrome na OSX Mojave.
źródło
źródło
za pomocą rozwiązania 113716 użytkownika, które, nawiasem mówiąc, jest świetne, aby uniknąć tych wszystkich, jeśli-inaczej wdrożyłem go w ten sposób, aby obliczyć sumę częściową pola tekstowego z jednostki pola tekstowego i ilości pola tekstowego.
W procesie pisania liczb nie będących liczbami w polach tekstowych jednostek i ilości, ich wartości są zastępowane przez zero, więc końcowe księgowanie danych użytkownika nie zawiera żadnych liczb.
źródło
Spróbuj tej prostej funkcji
źródło