W formularzu dane z pola input o typie number zostały zapisane do zmiennej a, a następnie przetworzone w skrypcie JavaScript w następujący sposób
var x = parseInt(a);Zmienna x będzie typu
A. NaN
B. liczbowego, całkowitego.
C. napisowego.
D. zmiennoprzecinkowego.
Pytanie z egzaminu CKE, październik 2016 (arkusz E.14-X-16.08).
W tym fragmencie kluczowe jest działanie funkcji parseInt(a). Dane pobrane z pola input typu number bardzo często trafiają do JavaScriptu jako tekst, jeśli korzystamy z właściwości value, mimo że użytkownik wpisuje liczbę. Funkcja parseInt próbuje odczytać z tego tekstu liczbę całkowitą i zwraca wartość typu number, czyli liczbowego. W praktyce wynik jest traktowany jako liczba całkowita, np. parseInt('123') da 123, a parseInt('12.75') da 12, bo część po kropce zostaje ucięta, a nie zaokrąglona. Warto pamiętać, że w samym JavaScripcie technicznie istnieje typ Number, a nie osobny typ int jak w C++ czy Javie, ale w szkolnym ujęciu odpowiedź „liczbowego, całkowitego” jest tu właściwa. Moim zdaniem warto od razu wyrabiać sobie dobry nawyk pisania parseInt(a, 10), żeby jasno wskazać system dziesiętny. W realnych formularzach trzeba też sprawdzać, czy wynik nie jest NaN, bo puste albo błędne dane nie dadzą sensownej liczby.
Najczęstsza pułapka w tym pytaniu polega na pomieszaniu typu danych pobranych z formularza z typem danych po przetworzeniu. Samo pole input typu number nie oznacza jeszcze, że w zmiennej a zawsze siedzi gotowa liczba. Gdy odczytujemy wartość przez value, przeglądarka przekazuje ją zwykle jako napis, czyli string. Dopiero funkcja parseInt wykonuje konwersję i zwraca wynik liczbowy. Dlatego uznanie, że x pozostanie typu napisowego, byłoby nietrafione, bo po wywołaniu parseInt nie operujemy już na tekście, tylko na wartości typu number. NaN też nie jest osobnym typem zmiennej w sensie takim, jak string czy number. To specjalna wartość oznaczająca Not a Number, która może się pojawić, gdy konwersja się nie uda, na przykład parseInt('abc') da NaN. Co ciekawe, typeof NaN w JavaScripcie zwraca number, co na początku wygląda trochę dziwnie, ale tak działa standard ECMAScript. Odpowiedź o typie zmiennoprzecinkowym też może kusić, bo JavaScript przechowuje liczby jako Number, najczęściej w formacie zmiennoprzecinkowym IEEE 754. Jednak parseInt z założenia odczytuje część całkowitą, więc z punktu widzenia zadania wynik jest liczbą całkowitą. Jeśli potrzebna jest liczba z częścią ułamkową, stosuje się raczej parseFloat albo Number, zależnie od sytuacji. Z mojego doświadczenia, najbezpieczniej po takiej konwersji zawsze zrobić walidację, np. sprawdzić Number.isNaN(x), bo formularze lubią przyjmować dane inne niż zakładaliśmy.