Instrukcja JavaScript
document.write(5 === '5');wyświetli
A. true
B. false
C. 0
D. 1
Wynik false wynika z działania operatora ścisłej równości === w JavaScript. Ten operator porównuje jednocześnie wartość oraz typ danych, bez wykonywania automatycznej konwersji typów. W instrukcji document.write(5 === '5'); po lewej stronie znajduje się liczba 5, czyli typ number, a po prawej stronie tekst '5', czyli typ string. Mimo że dla człowieka oba zapisy wyglądają bardzo podobnie, dla interpretera JavaScript to są dwa różne typy danych, więc porównanie zwraca wartość logiczną false. document.write wypisuje tę wartość w dokumencie jako tekst false. W praktyce to bardzo ważna rzecz, bo w formularzach dane często przychodzą jako napisy, nawet gdy użytkownik wpisze liczbę. Z mojego doświadczenia lepiej używać === zamiast ==, bo kod jest bardziej przewidywalny i łatwiej uniknąć dziwnych błędów. Jeśli naprawdę chcesz porównać liczby, warto wcześniej zrobić konwersję, np. Number('5') === 5 da true. To jest też zgodne z dobrą praktyką w JavaScript: jawnie konwertować dane, a nie liczyć na to, że język sam zgadnie nasze intencje.
W tym przykładzie łatwo pomylić porównanie ścisłe z luźnym porównaniem, a to w JavaScript robi dużą różnicę. Instrukcja document.write(5 === '5'); nie wypisze ani 1, ani 0, bo wynik operatora === jest wartością logiczną typu boolean, czyli może być true albo false. Liczby 1 i 0 mogą kojarzyć się z prawdą i fałszem z innych języków albo z rzutowania wartości logicznych na liczbę, ale tutaj document.write dostaje bezpośrednio boolean i wypisuje jego tekstową reprezentację. Nie następuje zamiana false na 0, bo nie ma tu operacji arytmetycznej ani jawnej funkcji Number(). Równie kusząca jest odpowiedź true, bo wizualnie 5 oraz '5' oznaczają jakby tę samą wartość. Problem w tym, że '5' jest napisem, a 5 jest liczbą. Operator === nie robi automatycznego dopasowania typów, dlatego różnica między string i number powoduje wynik false. Gdyby użyto operatora ==, wtedy JavaScript spróbowałby wykonać konwersję i wyrażenie 5 == '5' dałoby true. Moim zdaniem właśnie przez takie automatyczne konwersje początkujący często łapią błędy trudne do znalezienia. W profesjonalnym kodzie webowym zwykle preferuje się ===, bo porównania są bardziej jednoznaczne, a dane z formularzy, API czy parametrów URL najlepiej konwertować jawnie, np. przez Number(), parseInt() albo String(), zależnie od sytuacji.