Приращение JavaScript при назначении

У меня был разговор об операторе приращения префикса, и мы, похоже, столкнулись с разногласиями.

При запуске этого кода:

var x = 0;
x = ++x;

вторая строка эквивалентна:

  • х = (х = х + 1) ИЛИ
  • х = (х + 1)

Трудно сказать разницу, потому что результаты идентичны (оба результата x имеющий значение 1)

Я полагаю, что значение не сохраняется в исходной переменной, когда левой частью присваивания является сама переменная.

Мой коллега не согласен и считает, что значение сохраняется в исходную переменную всякий раз, когда ++ оператор используется.

Кто из нас прав?

4 ответа

Решение

Это сохранено, так что это похоже на первый пример. Возьмите для примера этот код:

var v = 0;
v = ++v + ++v + ++v;
// Returns 6

Это потому, что это будет переводиться на:

v = (0+1) + ((0+1)+1) + (((0+1)+1)+1);

Или, чтобы быть более точным:

v = 0+1 +
v = 1+1 + //Previous value of v + 1
v = 2+1   //Previous value of v + 1

Зачем?

++v сначала сохранит увеличенное значение v, затем вернет это увеличенное значение.
Чтобы упростить вещи, попробуйте это в вашей консоли:

x = 0;
++x;

Если ++x решил бы x + 1, значение x теперь все еще будет 0, право?
Нет, твой x будет 1, Это означает, что ++x там должен быть оператор присваивания.

Просто попробуйте написать оба ++x а также x++ в полных английских предложениях:
++x: увеличить x на единицу и вернуть значение
x++: вернуть значение x и увеличить его.

Ваша вторая строка (x = ++x;) эквивалентно x = (x += 1), да.
Просто посмотрите на любой цикл, который вы когда-либо написали:

for (var i = 0;i<100;i++)//<-- no need for another assign here

Так что вы могли бы написать ++x; все равно, но так как это выражение является целым утверждением, не имеет значения, если вы пишете x++; или же ++x...

Как вы, наверное, знаете xxsomeVar увеличивает переменную на 1, присваивает полученное значение этой переменной и затем возвращает его, someVar++ возвращает текущее значение переменной, а затем увеличивает его на 1 (новое значение, конечно, также присваивается переменной).

Так ++x; является эквивалентом x = (x + 1);

Из спецификации языка:
++ префиксный оператор приращения
Постфиксный оператор приращения ++

Выполнение:

var x = 0;
console.log(++x); // will make print 1

Делать:

var x = 0;
console.log(x++); // will make print 0
console.log(x); // will print 1

После прочтения спецификации языка ECMAScript в ответ на вопрос выясняется, что ++x эквивалентно x = ( x = x + 1 ),

Перевод шагов, описанных в спецификации:

  1. Результат операции будет присвоен х
  2. Выдает ошибку, если выполняются определенные условия
  3. oldValue = x
  4. newValue = oldValue + 1
  5. назначить newValue для x
  6. вернуть новое значение

Для оператора постинкремента выше будет возвращено oldValue вместо newValue,

var x = 0;
// x is assigned 1 during the post-increment operation but because
// the oldValue is returned it is immediately replaced by 0.
x = x++; 
console.log( x ) // prints 0
Другие вопросы по тегам