Почему постфиксный и префиксный инкременты выдают одно и то же значение?
==========================================================================

 Есть такие две строки кода. В первой используется префиксный инкремент, во второй - постфиксный.  

```
for (let i = 0; i < 3; ++i) alert( i );

for (let i = 0; i < 3; i++) alert( i );
```
  

  

Результат вывода двух циклов одинаковый – `0, 1, 2`. Почему?   

  

В постфиксном варианте по идее должно быть так:  

1. Начало сверяется с условием (0)--> true --> вывело значение.  

2. Выполняется шаг (+1), но само значение пока не меняется (все еще 0) --> сверяется с условием (0 < 3) --> выводится уже 1.  

3. Выполняется шаг (+1), но само значение опять же пока не меняется (все еще 1) --> сверяется с условием (1 < 3), выводится уже 2.  

4. Выполняется шаг (+1), но само значение опять же пока не меняется (все еще 2) --> сверяется с условием (2 < 3), выводится уже 3.  

5. Выполняется шаг (+1), но само значение опять же пока не меняется (все еще 3) --> сверяется с условием (3 < 3), ничего не выводится т.к. false.  

  

Как это может по-другому работать? 

 Проблема была в непонимании работы постфиксного и префиксного инкремента.   

  

1. Префиксный инкремент (также и декремент) вычитывает значение и сразу же возвращает уже "новое", только что высчитанное.  

  

2. Постфиксный инкремент (также и декремент) сначала выдает "старое" значение, а "новое" высчитывает уже после окончания инструкции. То есть... а++ – за пределами этой переменной с постфиксным инкрементом значение будет "новое", в пределах этой переменной с постфиксным инкрементом - пока еще "старое".   

  

Именно по этому в двух циклах for выдаются одинаковые значения, а в while - разные.  

`for (let i = 0; i < 3; i++) alert( i );`  

1. Проверяется условие начала - выводится.  

2. Выполняется шаг (в самом шаге переменная равна нулю, дальше шага - 1), выполняется сравнение - выводится и т.д.  

```
let i = 0;
while (i++ < 5) alert( i );
```
  

1. К начальному значению прибавляется 1 с помощью постфиксного инкремента (сама инструкция с инкрементом еще равна нулю, поэтому сравнение происходит с нулем; за пределами уже 1, поэтому выводится 1).  

То есть в while в условии находится само условие и шаг. В for все отдельно. 

 Не понятно, почему вы ожидаете именно разное поведение. Один оператор отличается от другого **только возвращаемым значением**. Возвращаемое значение в последнем выражении цикла for не влияет на выполнение цикла. Никакой дополнительной магии в данном цикле в JS нет. 

 Разница между `++i` и `i++` только в том, чему равно **само** это выражение:  

```
let i = 0;
alert(++i); // 1 – прибавили 1 и вернули результат

let j = 0;
alert(j++); // 0 – вернём значение до, и прибавим 1

// после уже всё одинаково
console.log(i, j); // 1, 1
```