Потому что вся разница между --i и i-- префиксным и постфиксным декрементом, --i уменьшает значение переменной на единицу и возвращает это же новое значение, i-- уменьшает значение переменной на единицу, но возвращает старое значение до уменьшения.
Например i = 2; alert(--i); уменьшит значение и выведет 1, alert(i--) уменьшит значение, но выведет 2
Как это работает?
Представим что изначально i = 2;
Когда начинает выполняться цикл while, проверяется условие цикла на истинность или ложность, while(i--) выражение внутри while в скобках i-- уменьшает значение на единицу, но возвращает старое значение до уменьшения, то есть 2 и именно это значение используется для проверки истинности или ложности условия цикла, т.к. 2 отличается от 0, соответственно условие является истинным, и затем уже выполняется тело цикла, выводится значение 1 в консоль, потому что i было уменьшено в условии цикла while, затем вновь проверяется условие, т.к. i = 1, то i-- уменьшает значение и возвращает старое, то есть 1, т.к. 1 удовлетворяет истинности цикла, выполняется тело цикла, и уже в консоль выводится 0, затем еще раз проверяется условие цикла, на этот раз i = 0, i-- уменьшает переменную на единицу и возвращает старое значение, то есть 0 и т.к. 0 в логическом контексте является false цикл while прекращает свою работу, а интерпретатор начинает исполнять код идущий после while, после выполнения цикла переменная i уже равна -1.
Объяснение может показаться сложным на первый взгляд, но ничего сложного нету, главное знать разницу между операторами префиксного и постфиксного инкремента и декремента. Новички часто путают разницу между --i и i--, думая что они работают одинаково, по факту так оно и есть, но разница все же есть, а именно то как и где они используются.
Наглядная разница префиксного и постфиксного декремента. Префиксный декремент уменьшает переменную до её использования в других выражениях, а постфиксный декремент, наоборот, уменьшает переменную только после того, как она будет использована в выражении.
Конкретно в данном случае использован постфиксный декремент, то есть значением выражения является значение переменной ДО уменьшения. Именно поэтому и образуется лишняя итерация, и получается значение -1 после выхода из цикла.
Вообще такое не должно работать по идее так как математические функции нельзя ставить в условие цикла. Однако, судя по комментариям, у остальных все запускается. Если так то у тебя проблема в том что ты не знаешь как используется декремент. Есть два варианта их использований, --i и i--. Разница в том что i-- использует а затем уменьшает, а --i сначала уменьшает а потом использует. Я совсем недавно разобрался с этим. Вбей в поиск ++i и i++ разница, разберешься, ничего сложного