почему последний alert(i) выводит 3, а не 2 (как последнее значение)? Как вообще цикл возвращает значение?

let i = 0;

for (i = 0; i < 3; i++) { // используем существующую переменную
  alert(i); // 0, 1, 2
}

alert(i); // 3, переменная доступна, т.к. была объявлена снаружи цикла


Ответы (2 шт):

Автор решения: Igor

Потому что после каждой итерации i увеличивается на единицу. После (не внутри) третьей итерации i равно 3. Перед четвертой итерацией происходит проверка условия i < 3, и цикл прерывается.

→ Ссылка
Автор решения: Zhihar

циклы for выглядят так:

i = 0;

cycle:

    тело цикла

    i ++;

    if условие
        goto cycle;

циклы while выглядят так:

cycle:

    if not(условие):
        goto end;

    тело цикла

    goto cycle;

end:

циклы do while (там где они есть) выглядят так:

cycle:
   
    тело цикла

    if условие:
        goto end;

    goto cycle;

end:

Так что в вашем случае было так:

i = 0;

cycle:

тело цикла

i ++;

if (i < 3)
    goto cycle;

так что на выходе получается i = 3

→ Ссылка