Объяснение Т.Дж. это хорошо на теоретическом уровне того, что происходит, но вот другое объяснение с другой стороны (более практическое, чем теоретическое):
У нас есть два похожих выражения b++
и ++b
. Оба означают b = b + 1
, но работают по-разному.
b++
оценивает текущее значение b
(которое равно 1), затем увеличивает его. Это эквивалентно:
var a = 0;
var b = 1;
a = b;
b = b + 1; //(b + 1) makes no difference
console.log(a);
++b
делает обратное, увеличивает b
, а затем оценивает его в увеличенное значение. Это эквивалентно:
var a = 0;
var b = 1;
b = b + 1; //(b + 1) makes no difference
a = b;
console.log(a);
Теперь обратите внимание, что добавление круглых скобок b + 1
в любом из приведенных выше примеров не будет иметь значения, поскольку присваивание a = b
выполняется на другом шаге. Точно так же добавление скобок к b++
не будет иметь никакого значения, поскольку присвоение a
и инкриминирование выполняются в два разных этапа.
Однако круглые скобки вокруг b++
фактически эквивалентны круглым скобкам вокруг b
в строке a = b
в приведенном выше коде, а не вокруг b + 1
, как вы, кажется, думаете из своего вопроса. И ясно, что круглые скобки a = (b)
не имеют никакого значения.
РЕДАКТИРОВАТЬ Как вы предложили в своем комментарии, если мы думаем о b++
как о неявной функции, то тело функции похоже на объяснение Т.Дж.:
- Сохранить значение
b
(1), скажем, в неявной переменной x
- Увеличение
b
до 2
- и возврат
x
Размещение скобок вокруг вызова функции похоже на помещение их вокруг возвращаемого значения, равного 1. Вот демонстрация:
var a = 0;
var b = 1;
a = bPlusPlus(); //(bPlusPlus()) makes no difference
console.log(a);
function bPlusPlus() {
var x = b;
b = b + 1;
return x;
}