++ SomeVariable Vs. someVariable++ в Javascript

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

8 ответов

Решение

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

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

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

x++;
++x;

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

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

x = 0;
y = array[++x]; // This will get array[1]
  • ++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++ Оператор, в котором вы читаете значение, оцениваете его, изменяете и сохраняете.

У меня есть объяснение понимания постинкремента и предварительного инкремента. Я помещаю это сюда.

Давайте назначим 0 к x

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

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

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

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

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

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

Я думал об этом вчера, читая этот ответ на вопрос о плохих предположениях в C / C++. Во всех случаях, можем ли мы гарантировать, что Javascript ведет себя таким образом? Или вы считаете плохой практикой использовать оператор приращения внутри более сложного оператора вообще?

Это понятнее и быстрее использовать, если это возможно:

  • ++iгарантирует, что вы используете значение, которое останется неизменным, если вы не измените
  • i++позволяет использовать значениеiчто изменится в "ближайшем будущем", не желательно по возможности

Конечно, это не намного быстрее, только немного.

Другие вопросы по тегам