Przejdź do głównej treści
  1. Strona główna
  2. Technik informatyk
  3. INF.03
  4. Pytanie

Kwalifikacja: INF.03 - Tworzenie i administrowanie stronami i aplikacjami internetowymi oraz bazami danych

Zawód: Technik informatyk, Technik programista

Kategorie: Programowanie webowe Algorytmy i podstawy informatyki JavaScript

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.

Wymagane logowanie

Ocenianie trudności pytań jest dostępne tylko dla zalogowanych użytkowników. Zaloguj się, aby skorzystać z pełni możliwości platformy.

Twoja ocena pomoże innym uczniom w przygotowaniu do egzaminu, a Tobie pozwoli na dostęp do spersonalizowanych statystyk.

Zgłoś błąd w pytaniu

Rozwiń sekcję i zmień pole, którego dotyczy błąd. Wyślemy tylko zmienione sekcje.

Błędna kwalifikacja
Błąd w treści pytania
Błąd w treści odpowiedzi
Błąd w obrazie
Dane kontaktowe (opcjonalnie)
Podaj email, jeśli chcesz otrzymać informację o rozpatrzeniu zgłoszenia.