Wynik skryptu wynika z kolejności wykonywania instrukcji oraz z tego, jak działają operatory inkrementacji i dekrementacji w JavaScript.
1) Stan początkowy
Ustawiane jest x = 1. Zmienna y jest zadeklarowana, ale nie ma przypisanej wartości, więc ma wartość undefined.
2) Instrukcja ++y
Preinkrementacja próbuje zwiększyć wartość y. Ponieważ y jest niezainicjalizowana, podczas konwersji do liczby powstaje wartość "not a number". Ważne w tym zadaniu: ta wartość nie jest nigdzie wypisywana, więc nie wpływa na widoczny wynik.
3) document.write(++x)
To preinkrementacja: najpierw zwiększa x, potem zwraca nową wartość. Zatem x zmienia się z 1 na 2 i wypisywane jest 2.
4) document.write(x--)
To postdekrementacja: najpierw zwraca bieżącą wartość, a dopiero potem zmniejsza zmienną. W tym momencie x wynosi 2, więc wypisuje 2, a następnie x zostaje zmniejszone do 1.
5) document.write(x)
Po wykonaniu postdekrementacji x ma już wartość 1, więc ostatnie wypisanie daje 1.
Dlaczego pozostałe odpowiedzi są błędne?
- Wynik "2 1 1" zakłada, że po ++x od razu otrzymamy 2, ale x-- wypisze 1. To pomija fakt, że postdekrementacja wypisuje wartość sprzed zmniejszenia.
- Wynik "1 2 1" sugeruje, że ++x wypisuje starą wartość (jakby była to postinkrementacja), co jest niezgodne z definicją preinkrementacji.
- Wynik "1 2 2" dodatkowo zakłada, że x nie zostaje zmniejszone po x-- lub że x-- nie ma efektu ubocznego, co jest typowym błędem nieuwzględnienia zmiany stanu zmiennej.
Podsumowując, widoczne wypisania to kolejno: 2, spacja, 2, spacja, 1, czyli odpowiedź "2 2 1".