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 = parseFloat(a);
Zmienna x będzie typu
Odpowiedź „zmiennoprzecinkowego” dobrze oddaje działanie funkcji parseFloat(a). Dane pobrane z pola formularza, nawet z input type="number", w praktyce bardzo często trafiają do JavaScriptu jako tekst, np. wartość właściwości value to napis typu "12.5". Funkcja parseFloat próbuje odczytać z takiego tekstu liczbę z częścią dziesiętną i zwraca wartość liczbową, np. parseFloat("3.14") da 3.14. W JavaScripcie trzeba tylko pamiętać o ważnym szczególe: formalnie typ zwracany przez parseFloat to Number, czyli ten sam typ dla liczb całkowitych i ułamkowych. Nie ma osobnego typu float jak np. w C++ czy Javie. Silnik JS przechowuje liczby według standardu IEEE 754 jako wartości zmiennoprzecinkowe podwójnej precyzji, więc odpowiedź z punktu widzenia zadania jest poprawna. Praktycznie używa się tego przy obliczeniach z formularzy: ceny, wagi, procenty, pola zamówienia itd. Dobra praktyka to po konwersji sprawdzić wynik przez Number.isNaN(x), bo parseFloat("abc") zwróci NaN, a dalsze obliczenia mogą się wtedy dziwnie rozsypać. Moim zdaniem to jeden z tych drobiazgów w JS, które warto ogarnąć wcześnie, bo formularze bez konwersji typów potrafią dawać bardzo mylące wyniki, np. "2" + "3" daje "23", a nie 5.
W tym pytaniu łatwo pomylić kilka pojęć, bo formularz HTML i JavaScript trochę inaczej traktują dane, niż sugeruje sama nazwa input type="number". To, że pole w formularzu przyjmuje liczbę, nie znaczy jeszcze, że w skrypcie automatycznie mamy gotową liczbę w sensie obliczeniowym. Wartość pobrana z pola, zwłaszcza przez właściwość value, jest zazwyczaj napisem, dlatego stosuje się funkcje konwertujące, takie jak parseFloat albo Number. parseFloat nie tworzy typu napisowego, tylko analizuje tekst i próbuje wyciągnąć z niego liczbę zmiennoprzecinkową. Gdy podasz "18.75", wynikiem będzie 18.75 jako wartość typu Number, a nie tekst "18.75". Mylenie wyniku z napisem bierze się często z tego, że dane startują w formularzu jako ciąg znaków.
NaN też nie jest typem zmiennej w takim sensie, jak często się o tym myśli. NaN oznacza „Not a Number” i jest specjalną wartością liczbową, która pojawia się, gdy konwersja się nie uda, np. parseFloat("kot"). Co ciekawe, typeof NaN zwraca "number", co bywa trochę nielogiczne na pierwszy rzut oka, ale wynika ze specyfikacji ECMAScript. Nie można więc powiedzieć, że zmienna x będzie typu NaN. Może mieć wartość NaN, ale nadal w ramach typu Number.
Odpowiedź o liczbie całkowitej też jest zbyt wąska. parseFloat nie ogranicza wyniku do integera. Do liczb całkowitych służy raczej parseInt, chociaż i tej funkcji trzeba używać świadomie, najlepiej z podaniem podstawy systemu liczbowego. parseFloat zachowa część ułamkową, więc z "10.5" zrobi 10.5, a nie 10. W praktyce przy danych z formularzy warto po konwersji walidować wynik, sprawdzać zakresy i dopiero potem wykonywać obliczenia. To jest taka zwykła, branżowa higiena kodu, niby mała rzecz, a oszczędza sporo błędów w aplikacji.
NaN też nie jest typem zmiennej w takim sensie, jak często się o tym myśli. NaN oznacza „Not a Number” i jest specjalną wartością liczbową, która pojawia się, gdy konwersja się nie uda, np. parseFloat("kot"). Co ciekawe, typeof NaN zwraca "number", co bywa trochę nielogiczne na pierwszy rzut oka, ale wynika ze specyfikacji ECMAScript. Nie można więc powiedzieć, że zmienna x będzie typu NaN. Może mieć wartość NaN, ale nadal w ramach typu Number.
Odpowiedź o liczbie całkowitej też jest zbyt wąska. parseFloat nie ogranicza wyniku do integera. Do liczb całkowitych służy raczej parseInt, chociaż i tej funkcji trzeba używać świadomie, najlepiej z podaniem podstawy systemu liczbowego. parseFloat zachowa część ułamkową, więc z "10.5" zrobi 10.5, a nie 10. W praktyce przy danych z formularzy warto po konwersji walidować wynik, sprawdzać zakresy i dopiero potem wykonywać obliczenia. To jest taka zwykła, branżowa higiena kodu, niby mała rzecz, a oszczędza sporo błędów w aplikacji.