Приращение 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 )
,
Перевод шагов, описанных в спецификации:
- Результат операции будет присвоен х
- Выдает ошибку, если выполняются определенные условия
- oldValue = x
- newValue = oldValue + 1
- назначить newValue для x
- вернуть новое значение
Для оператора постинкремента выше будет возвращено 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