++ 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/ для примера.



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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.