++ someVariable vs. someVariable ++ w JavaScript

135

W JavaScript możesz użyć ++operatora przed ( preinkrementacja ) lub po nazwie zmiennej ( post-inkrementacja ). Jakie są różnice między tymi sposobami inkrementacji zmiennej?

Derek Adair
źródło
1
Zobacz także różnicę
Bergi
Myślałem o tym wczoraj czytając tę odpowiedź na pytanie o złe założenia w C / C ++ . Czy we wszystkich przypadkach możemy zagwarantować, że JavaScript zachowa się w ten sposób? A może uważasz, że używanie instrukcji inkrementacji w bardziej złożonej instrukcji jest złą praktyką?
palswim
Poprzedni komentarz jest w rzeczywistości kopią odpowiedzi (raczej braku odpowiedzi), którą opublikowałem w 2010 roku . Usunąłem odpowiedź, ale Jon Skeet odpowiedział : „Patrząc na ECMA-262, wydaje się, że jest dość dobrze określony”.
palswim

Odpowiedzi:

242

Tak samo jak w innych językach:

  • ++x (pre-inkrementacja) oznacza „inkrementuj zmienną; wartością wyrażenia jest wartość końcowa”
  • x++ (post-inkrementacja) oznacza „zapamiętaj oryginalną wartość, a następnie zwiększ zmienną; wartością wyrażenia jest oryginalna wartość”

Teraz, gdy są używane jako samodzielna instrukcja, oznaczają to samo:

x++;
++x;

Różnica pojawia się, gdy użyjesz wartości wyrażenia w innym miejscu. Na przykład:

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

x = 0;
y = array[++x]; // This will get array[1]
Jon Skeet
źródło
13
O przekleństwa, prawie pokonałem cię w odpowiedzi, gdybym nie zatrzymał się, aby załadować praktyczną odpowiedź jsfiddle. ;-)
Chris
2
Jak by to wyglądało, gdybyś użył go + 1zamiast ++? Czy istnieje sposób na zwiększenie wartości przed lub po dodawaniu liczb?
Keavon
Chciałbym wiedzieć, dlaczego, jeśli wykonasz tę operację const r1 = (x ++) + (x ++); nie daje oczekiwanych rezultatów zgodnie z twoim przykładem.
Jean Jimenez
1
@JeanJimenez: Cóż, daje rezultat, którego oczekuję. Na przykład, jeśli xzaczyna się od 10, wartość r1wynosi 21, czyli 10 + 11. Wartość pierwszej x++ekspresji wynosi 10 i xzwiększa się do 11 wartości w drugiej x++ekspresji wynosi 11 i xzwiększa się do 12
Jon Skeet
Drogi @JonSkeet dzięki za superszybką odpowiedź. Jestem nowy w nauce JavaScript i moje zdezorientowanie dotyczy tego, dlaczego jeden się zwiększa, a drugi nie.
Jean Jimenez
43
  • ++x zwiększa wartość, a następnie ocenia ją i zapisuje.
  • x++ ocenia wartość, a następnie ją zwiększa i zapisuje.
var n = 0, m = 0;

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

Zauważ, że używanie ++xtam, gdzie to możliwe, przynosi niewielkie korzyści w zakresie wydajności , ponieważ odczytujesz zmienną, modyfikujesz ją, a następnie oceniasz i zapisujesz. W przeciwieństwie do x++operatora, w którym odczytujesz wartość, oceniasz ją, modyfikujesz, a następnie zapisujesz.

Justin Force
źródło
7

Jak rozumiem, jeśli używasz ich samodzielnie, robią to samo. Jeśli spróbujesz wypisać ich wynik jako wyrażenie, mogą się one różnić. Wypróbuj alert (i ++) w porównaniu z alertem (++ i), aby zobaczyć różnicę. i ++ oblicza wartość i przed dodaniem, a ++ i wykonuje dodanie przed oceną.

Zobacz przykład http://jsfiddle.net/xaDC4/ .

Chris
źródło
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

Code Guy
źródło
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
źródło
0

Mam wyjaśnienie zrozumienia post-inkrementacji i preinkrementacji. Więc umieszczam to tutaj.

Pozwala przypisać 0dox

let x = 0;

Zacznijmy od post-inkrementacji

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

Czemu?

Przełammy x++wyrażenie

x = x;
x = x + 1;

Pierwsza instrukcja zwraca wartość, xktórej jest0

A później, gdy użyjesz xzmiennej w dowolnym miejscu, wykonywana jest druga instrukcja

Druga instrukcja zwraca wartość tego x + 1wyrażenia, którą jest(0 + 1) = 1

Należy pamiętać o wartości xw tym stanie1

Teraz zacznijmy od preinkrementacji

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

Czemu?

Przełammy ++xwyrażenie

x = x + 1;
x = x;

Pierwsza instrukcja zwraca wartość tego x + 1wyrażenia, którą jest(1 + 1) = 2

Druga instrukcja zwraca wartość, xktóra jest 2tak x = 2więc zwraca2

Mam nadzieję, że to pomoże ci zrozumieć, czym są post-inkrementacja i preinkrementacja!

Unlexo
źródło