++ someVariable против someVariable ++ в JavaScript

136

В JavaScript вы можете использовать ++оператор перед ( преинкремент ) или после имени переменной ( постинкремент ). В чем, если таковые имеются, различия между этими способами приращения переменной?

Дерек Адэйр
источник
1
См. Также не зависящую от языка разницу между i ++ и ++ i в цикле?
Берги
Я думал об этом вчера, читая этот ответ на вопрос о плохих предположениях в C / C ++ . Во всех случаях, можем ли мы гарантировать, что Javascript ведет себя таким образом? Или вы считаете плохой практикой использовать оператор приращения внутри более сложного оператора вообще?
Palswim
Предыдущий комментарий на самом деле является копией ответа (скорее без ответа), который я опубликовал в 2010 году . Я удалил ответ, но Джон Скит ответил : «Глядя на ECMA-262, он кажется достаточно точным».
Palswim

Ответы:

243

То же, что и на других языках:

  • ++x (предварительное увеличение) означает «увеличить переменную; значение выражения является окончательным значением»
  • x++ (постинкремент) означает «запомнить исходное значение, затем увеличить значение переменной; значение выражения является исходным значением»

Теперь, когда они используются как самостоятельное утверждение, они означают одно и то же:

x++;
++x;

Разница возникает, когда вы используете значение выражения в другом месте. Например:

x = 0;
y = array[x++]; // This will get array[0]

x = 0;
y = array[++x]; // This will get array[1]
Джон Скит
источник
13
Проклятия, я чуть не побил тебя до ответа, если бы я не остановился, чтобы загрузить практический ответ jsfiddle. ;-)
Крис
2
Как бы это выглядело, если бы вы использовали + 1вместо ++? Есть ли способ увеличения до или после добавления чисел?
Кивон
Я хотел бы знать, почему, если вы делаете эту операцию const r1 = (x ++) + (x ++); он не дает ожидаемого результата в соответствии с вашим примером.
Жан Хименес
1
@JeanJimenez: Ну, это дает результат, который я ожидаю. Например, если xначинается с 10, значение r1равно 21, что составляет 10 + 11. Значение первого x++выражения равно 10 и xувеличивается до 11. Значение второго x++выражения равно 11 и xувеличивается до 12.
Джон Скит
Уважаемый @JonSkeet, спасибо за этот сверхбыстрый ответ, я новичок в изучении JavaScript, и моя путаница связана с тем, почему одно увеличивает, а другое нет.
Жан Хименес
43
  • ++x увеличивает значение, затем оценивает и сохраняет его.
  • x++ оценивает значение, затем увеличивает и сохраняет его.
var n = 0, m = 0;

alert(n++); /* Shows 0, then stores n = 1 */
alert(++m); /* Shows 1, then stores m = 1 */

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

Джастин Форс
источник
7

Как я понимаю, если вы используете их автономно, они делают то же самое. Если вы попытаетесь вывести их результат в виде выражения, они могут отличаться. Попробуйте alert (i ++) по сравнению с alert (++ i), чтобы увидеть разницу. i ++ оценивает i перед сложением, а ++ i добавляет перед оценкой.

См. Http://jsfiddle.net/xaDC4/ для примера.

Крис
источник
2
var a = 1;
var b = ++a;
alert('a:' + a + ';b:' + b); //a:2;b:2

var c = 1;
var d = c++;
alert('c:' + c + ';d:' + d); //c:2;d:1

jsfiddle

Кодовый парень
источник
0
var x = 0, y = 0;

//post-increment: i++ returns value then adds one to it
console.log('x++ will log: ', x++); //0
console.log('x after x++ : ', x);    //1

//pre-increment: adds one to the value, then returns it
console.log('++y will log: ', ++y); //1
console.log('y after ++y : ', y);   //1
cacoder
источник
0

У меня есть объяснение понимания пост-инкремента и пре-инкремента. Так что я выкладываю это здесь.

Позволяет присвойте 0Tox

let x = 0;

Начнем с постинкремента

console.log(x++); // Outputs 0

Зачем?

Давайте разберем x++выражение

x = x;
x = x + 1;

Первое утверждение возвращает значение xкоторого0

И позже, когда вы используете xпеременную в любом месте, то выполняется второй оператор

Второе утверждение возвращает значение этого x + 1выражения, которое(0 + 1) = 1

Имейте в виду значение xв этом состоянии, которое1

Теперь давайте начнем с предварительного увеличения

console.log(++x); // Outputs 2

Зачем?

Давайте разберем ++xвыражение

x = x + 1;
x = x;

Первый оператор возвращает значение этого x + 1выражения, которое(1 + 1) = 2

Второе утверждение возвращает значение xкоторого, 2таким x = 2образом, оно возвращает2

Надеюсь, это поможет вам понять, что такое постинкремент и преинкремент!

unclexo
источник