W języku JavaScript wynik działania instrukcji zmienna1 -= 1; będzie taki sam, jak instrukcji
A. zmienna1++;
B. zmienna1 === zmienna1 - 1;
C. zmienna1 = zmienna1 - 0;
D. zmienna1--;
Pytanie z egzaminu CKE, czerwiec 2022 (arkusz E.14-SG-22.06).
Instrukcja zmienna1 -= 1; używa operatora przypisania z odejmowaniem. W praktyce oznacza to: weź aktualną wartość zmiennej, odejmij od niej 1 i zapisz wynik z powrotem do tej samej zmiennej. Czyli efekt dla samej zmiennej jest taki sam jak przy zmienna1--;, bo operator dekrementacji także zmniejsza wartość zmiennej o jeden. Jeśli zmienna1 ma wartość 10, to po wykonaniu zmienna1 -= 1; będzie miała 9. Po wykonaniu zmienna1--; też będzie miała 9. Ważny szczegół: jako samodzielna instrukcja te zapisy dają ten sam efekt, ale w większym wyrażeniu mogą się różnić, bo zmienna1-- zwraca najpierw starą wartość, a dopiero potem zmniejsza zmienną. Moim zdaniem to jeden z tych drobiazgów w JavaScript, które warto dobrze wyczuć, bo potem często pojawiają się w pętlach, licznikach, obsłudze indeksów tablic albo prostych mechanizmach typu licznik kliknięć. Zgodnie z dobrymi praktykami kod powinien być czytelny: jeśli chcesz jasno pokazać zmniejszenie o 1, zapis zmienna1-- jest krótki i powszechnie rozumiany, ale przy bardziej złożonych zmianach, np. o 5, lepiej użyć zmienna1 -= 5;.
W tym pytaniu łatwo pomylić operator przypisania z operatorem porównania albo zwykłym działaniem arytmetycznym. Zapis zmienna1 -= 1; nie tylko oblicza wartość mniejszą o jeden, ale przede wszystkim zapisuje ją ponownie do tej samej zmiennej. To jest kluczowe. Samo sprawdzenie warunku typu zmienna1 === zmienna1 - 1 nie zmienia wartości zmiennej. Operator === w JavaScript służy do ścisłego porównania wartości i typu, więc zwraca jedynie true albo false. Dla normalnej liczby taki warunek prawie zawsze będzie fałszywy, bo np. 5 nie jest równe 4. Nie ma tu żadnej modyfikacji danych, a początkujący czasem traktują znak równości jako „ustawienie wartości”, co w programowaniu jest zdradliwe. Z kolei zmienna1++ działa w przeciwną stronę: zwiększa zmienną o 1, więc jest odpowiednikiem zmienna1 += 1;, a nie odejmowania. To typowy błąd wynikający z tego, że operatory ++ i -- wyglądają podobnie, ale robią dokładnie odwrotne rzeczy. Natomiast zmienna1 = zmienna1 - 0; zapisuje do zmiennej wynik odejmowania zera. Dla liczby wartość się praktycznie nie zmieni, choć JavaScript może przy okazji wykonać konwersję typu, jeśli zmienna zawiera np. tekst. W dobrym kodzie produkcyjnym lepiej unikać takich mylących zapisów, bo utrudniają czytanie i debugowanie. Najważniejsza zasada jest prosta: -= zmniejsza i przypisuje, -- zmniejsza o jeden, ++ zwiększa o jeden, a === tylko porównuje bez zmiany wartości.