Zadanie pokazuje, w jaki sposób formy postfix/prefix mogą prowadzić do różnych wyników w przypadku ich wykorzystania w porównaniach.
-
Od 1 do 4
let i = 0; while (++i < 5) alert( i );
Pierwszą wartością jest
i = 1
, ponieważ++i
najpierw powiększyi
, a następnie zwraca nową wartość. Tak więc pierwsze porównanie jest1 < 5
, aalert
pokazuje1
.Następnie podążając
2, 3, 4...
-- wartości pojawiają się jedna po drugiej. Porównanie zawsze używa zwiększonej wartości, ponieważ++
jest przed zmienną.W końcu,
i = 4
jest zwiększone do5
, porównaniewhile(5 < 5)
zawodzi, a pętla się zatrzymuje. Tak więc5
nie jest pokazane. -
Od 1 do 5
let i = 0; while (i++ < 5) alert( i );
Pierwszą wartością jest ponownie
i = 1
. Przyrostkowa formai++
zwiększai
, a następnie zwraca starą wartość, więc porównaniei++ < 5
użyjei = 0
(w przeciwieństwie do++i < 5
).Ale zawołanie
alert
jest osobne. Jest to kolejna stwierdzenie, która wykonuje się po inkrementacji i porównaniu. Więc dostaje bieżącyi = 1
.Potem kolejno
2, 3, 4…
Zatrzymajmy się na
i = 4
. Forma prefiksu++i
zwiększyłaby go i użyła5
w porównaniu. Ale tutaj mamy formę przyrostkowąi++
. Zwiększa więci
do5
, ale zwraca starą wartość. Stąd porównaniewhile(4 < 5)
jest prawdziwe, a kontrola przechodzi doalert
.Wartość
i = 5
jest ostatnią, ponieważ w następnym krokuwhile(5 < 5)
jest fałszywe.