Warunek zapisany w JavaScript jest prawdziwy, gdy zmienna x przechowuje
if (( !isNaN(x) ) && ( x > 0 ))
A. dowolną dodatnią wartość liczbową.
B. dowolną całkowitą wartość liczbową.
C. wartość nie liczbową.
D. pusty napis.
Pytanie z egzaminu CKE, styczeń 2016 (arkusz E.14-X-16.01).
Ten warunek składa się z dwóch sprawdzeń połączonych operatorem logicznym &&, czyli oba muszą być spełnione naraz. Fragment !isNaN(x) oznacza, że wartość x da się potraktować jako liczbę, bo isNaN zwraca true wtedy, gdy coś nie jest liczbą, a wykrzyknik odwraca wynik. Druga część, x > 0, wymaga, żeby ta liczba była większa od zera. W praktyce warunek przejdzie np. dla x = 1, x = 15.7 albo nawet dla tekstu typu x = "8", bo globalna funkcja isNaN w JavaScript wykonuje konwersję typu. Moim zdaniem to jest właśnie pułapka, o której warto pamiętać w formularzach WWW: dane z inputów często przychodzą jako napisy, więc dobrze jest jawnie użyć Number(x), a potem sprawdzić Number.isNaN(wartosc). Branżowo jest to czytelniejsze i bezpieczniejsze, szczególnie przy walidacji ceny, wieku, liczby sztuk czy dodatniego identyfikatora. Istotne jest też, że zero nie spełnia warunku, bo 0 > 0 jest fałszywe. Liczba ujemna też odpada, nawet jeśli oczywiście nadal jest liczbą.
W tym warunku łatwo pomylić samo sprawdzanie, czy coś jest liczbą, ze sprawdzaniem konkretnego zakresu wartości. Zapis !isNaN(x) nie oznacza wartości nieliczbowej, tylko dokładnie odwrotnie: po użyciu operatora negacji ! oczekujemy, że x da się zinterpretować jako liczba. Gdyby x miało np. tekst abc, funkcja isNaN(x) zwróciłaby true, a po negacji dostalibyśmy false, więc cały warunek z operatorem && nie zostałby wykonany. Pusty napis też jest ciekawym przypadkiem, bo w JavaScript globalne isNaN robi konwersję typów i pusty tekst może zostać potraktowany jak 0. Mimo to druga część x > 0 nie przejdzie, bo 0 nie jest większe od zera. To taki typowy haczyk w JS, który w realnych formularzach potrafi narobić bałaganu. Nie wystarczy również powiedzieć, że pasuje dowolna całkowita wartość liczbowa, bo liczby całkowite mogą być ujemne albo równe zero, a warunek wyraźnie wymaga wartości większej od 0. Dodatkowo warunek nie ogranicza się tylko do liczb całkowitych: 2.5 też spełnia x > 0 i jest poprawną dodatnią wartością liczbową. Z mojego doświadczenia najlepiej czytać takie instrukcje krok po kroku: najpierw typ lub możliwość konwersji na liczbę, potem zakres wartości, a dopiero na końcu wynik operatora &&.