var x = 5; var y = 3; if (x = y) document.getElementById("demo").innerHTML = 'zmienne są równe'; else document.getElementById("demo").innerHTML =...
var x = 5; var y = 3; if (x = y) document.getElementById("demo").innerHTML = 'zmienne są równe'; else document.getElementById("demo").innerHTML = 'zmienne się różnią';W ramce przedstawiono kod JavaScript z błędem logicznym. Program powinien wypisywać informację, czy liczby są sobie równe czy nie, lecz nie wykonuje tego. Wskaż odpowiedź, która dotyczy błędu.
A. W klauzuli if występuje przypisanie zamiast porównania.
Dobrze.
x = y przypisuje wartość, a porównanie wymaga === albo ==.B. Nieprawidłowo zadeklarowano zmienne.
Źle. Deklaracje
var x = 5; i var y = 3; są poprawne.C. Instrukcje wewnątrz sekcji if oraz else powinny być zamienione miejscami.
Źle. Warunek jest zawsze prawdziwy, więc zamiana gałęzi niczego nie naprawi.
D. Przed klauzulą else nie powinno być średnika.
Źle. Średnik kończy instrukcję gałęzi
if bez klamer i jest tu dozwolony.Pytanie z egzaminu CKE, styczeń 2017 (arkusz E.14-X-17.01).
Warunek
if (x = y) zawiera pojedynczy znak równości, czyli przypisanie. Zamiast porównać liczby, program wpisuje do x wartość 3, a wynik przypisania, liczba 3, jest traktowany jako prawda. Dlatego zawsze wykona się gałąź „zmienne są równe”, niezależnie od wartości zmiennych. Do zapamiętania: = przypisuje, == porównuje z konwersją typów, a === porównuje wartość i typ. Poprawny warunek to if (x === y). Taki błąd jest logiczny, a nie składniowy, więc przeglądarka go nie zgłosi; wykryje go dopiero test albo narzędzie typu ESLint z regułą zakazującą przypisań w warunkach. Ten sam błąd zdarza się w PHP, C++ i Javie.Wybór innej odpowiedzi zwykle oznacza szukanie błędu tam, gdzie kod jest poprawny. Deklaracje
var x = 5; i var y = 3; są prawidłowe; dziś częściej pisze się let lub const, ale var działa. Średnik przed else w tym kodzie kończy instrukcję w gałęzi if i jest dozwolony, bo gałąź nie ma nawiasów klamrowych; kłopot sprawiłby dopiero średnik tuż po if (...). Zamiana treści gałęzi też nic nie da: warunek zawsze jest prawdziwy, więc program po zamianie zawsze pisałby, że zmienne się różnią. Źródłem błędu jest pojedynczy znak = w warunku, który przypisuje zamiast porównywać. Dobrą praktyką jest też otaczanie treści gałęzi nawiasami klamrowymi, nawet przy jednej instrukcji - kod staje się czytelniejszy i trudniej o pomyłkę przy jego rozbudowie. W PHP i C++ pojedynczy znak równości w warunku działa identycznie i daje ten sam błąd.