KWALIFIKACJA INF3 - PAŹDZIERNIK 2016

PYTANIE NR 27.
W przedstawionym kodzie JavaScript dla ułatwienia ponumerowano linie. W kodzie znajduje się błąd, gdyż po uruchomieniu żaden komunikat nie zostaje wyświetlony. Aby wyeliminować błąd, należy

1. if (a < b)
2. document.write(a);
3. document.write(" jest mniejsze");
4. else
5. document.write(b);
6. document.write(" jest mniejsze");

A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
W JavaScript, gdy w gałęzi if lub else ma się wykonać więcej niż jedna instrukcja, trzeba zgrupować je w blok w nawiasach klamrowych. Bez klamr tylko pierwsze polecenie należy do if, a else nie wiąże się poprawnie z warunkiem, co skutkuje błędem i brakiem komunikatu.

Pełne wyjaśnienie:

Instrukcja if...else w JavaScript steruje wykonaniem kodu na podstawie warunku. Kluczowe jest to, że bez nawiasów klamrowych każda gałąź (if i else) obejmuje domyślnie tylko jedną instrukcję.

W pokazanym fragmencie w każdej gałęzi mają zostać wykonane dwie instrukcje: jedna wypisuje wartość (a albo b), a druga dopisuje tekst " jest mniejsze". Aby obie instrukcje były traktowane jako część jednej gałęzi, muszą zostać ujęte w blok:

  • dla warunku: if (a < b) { ... }
  • dla alternatywy: else { ... }

Bez klamer parser JavaScript przypisuje do if tylko pierwszą instrukcję po nim. Kolejna instrukcja staje się "luźną" instrukcją poza warunkiem, a słowo else pojawia się w miejscu, w którym nie jest już poprawnie powiązane z odpowiadającym mu if. To typowo kończy się błędem składniowym i przerwaniem wykonywania skryptu, więc użytkownik nie widzi żadnego komunikatu.

Dlaczego pozostałe propozycje są błędne?

  • Dodanie znaku $ przed nazwami zmiennych dotyczy składni PHP, nie JavaScript. W JS zmienne nie są poprzedzane znakiem dolara (choć $ może występować w nazwie identyfikatora, nie jest to "wymagany prefiks").
  • Wstawienie a i b w cudzysłów zamieniłoby zmienne na napisy "a" i "b", co zmieniłoby sens porównania i wypisywania — nie naprawia struktury instrukcji warunkowej.
  • Zamiana cudzysłowów na apostrofy nic nie wnosi, bo w JavaScript zarówno "..." jak i '...' są poprawnymi literałami łańcuchowymi. Problemem nie jest rodzaj cudzysłowu, tylko brak bloków instrukcji.

Wskazówka egzaminacyjna: gdy po if lub else widzisz więcej niż jedną instrukcję, niemal zawsze potrzebujesz nawiasów klamrowych, nawet jeśli wcięcia sugerują "blok".

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Nawiasy klamrowe { } tworzą blok instrukcji. Dzięki temu w gałęzi if (lub else) można wykonać więcej niż jedno polecenie, a interpreter jednoznacznie wie, które linie należą do danej części warunku.
Bez klamr do if należy tylko pierwsza instrukcja po nim. Jeśli potem pojawi się kolejna instrukcja, a dopiero po niej else, to else nie ma już "pasującego" if w odpowiednim miejscu składniowym, co może zakończyć się błędem i przerwaniem skryptu.
Formalnie nie zawsze: gdy w danej gałęzi jest dokładnie jedna instrukcja, klamry są opcjonalne. W praktyce często zaleca się pisać je zawsze, bo zmniejsza to ryzyko błędów przy dopisywaniu kolejnych linii i poprawia czytelność kodu.
Błędem jest brak bloków dla wieloliniowych gałęzi. Każda gałąź ma wykonać dwie instrukcje document.write, więc powinny być ujęte w { }. Bez tego struktura if...else jest niepoprawna i skrypt może się nie wykonać.
Tak. Zarówno "tekst" jak i 'tekst' to poprawne literały łańcuchowe w JavaScript. Wybór jest kwestią stylu (ważna jest konsekwencja). Zmiana cudzysłowów na apostrofy nie naprawi błędów struktury instrukcji if...else.
W JavaScript znak $ może wystąpić w nazwie identyfikatora (np. $x), ale nie jest obowiązkowym prefiksem zmiennych. Dodawanie $ "żeby działało" to typowy nawyk z PHP i nie rozwiązuje problemów składniowych w JS.
Sprawdź strukturę: nawiasy ( ), klamry { }, średniki i to, czy else jest bezpośrednio po instrukcji if. Jeśli w gałęzi warunku są dwie lub więcej instrukcji, brak klamr jest częstą przyczyną błędów.
Najczęściej wtedy, gdy skrypt w ogóle się nie uruchomi przez błąd składni (np. źle zbudowane if...else). Wtedy interpreter przerywa wykonanie, a funkcje wyświetlające nie zostaną wywołane. W praktyce warto też sprawdzić konsolę błędów.
Użyj bloków: if (warunek) { instrukcja1; instrukcja2; } else { instrukcja3; instrukcja4; }. To gwarantuje, że wszystkie polecenia należą do właściwej gałęzi i unikniesz problemów z "wiszącym" else.
Typowe błędy to: brak klamr przy wielu instrukcjach, dopisanie nowej linii do gałęzi bez aktualizacji bloków, mylenie składni z innymi językami (np. $ z PHP), oraz błędne założenie, że wcięcia mają znaczenie składniowe (w JS nie mają).
info

To pytanie poprawnie rozwiązuje 47% zdających egzamin. trudne

Według specjalistów z branży: "W JavaScript, gdy w gałęzi if lub else ma się wykonać więcej niż jedna instrukcja, trzeba zgrupować je w blok w nawiasach klamrowych."

Źródła:

  • MDN Web Docs: if...else (JavaScript) — https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/if...else (dostęp: 2026-02-27)
  • MDN Web Docs: Block statement (JavaScript) — https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/block (dostęp: 2026-02-27)
  • MDN Web Docs: Document.write() — https://developer.mozilla.org/en-US/docs/Web/API/Document/write (dostęp: 2026-02-27)

Materiały:

  • Dokumentacja MDN: instrukcja if...else
  • Dokumentacja MDN: bloki instrukcji i składnia JavaScript
  • Ćwiczenia: refaktoryzacja jednolinijkowych if na wersje z klamrami i wieloma instrukcjami

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego