++ someVariable vs. someVariable ++ in JavaScript

135

In JavaScript können Sie den ++Operator vor ( Vorinkrementierung ) oder nach dem Variablennamen ( Nachinkrementierung ) verwenden. Was sind, wenn überhaupt, die Unterschiede zwischen diesen Methoden zum Inkrementieren einer Variablen?

Derek Adair
quelle
1
Siehe auch den sprachunabhängigen Unterschied zwischen i ++ und ++ i in einer Schleife?
Bergi
Ich habe gestern darüber nachgedacht und diese Antwort auf die Frage nach schlechten Annahmen in C / C ++ gelesen . Können wir in jedem Fall garantieren, dass sich Javascript so verhält? Oder halten Sie es für eine schlechte Praxis, die Inkrement-Anweisung überhaupt in einer komplexeren Anweisung zu verwenden?
Palswim
Der vorherige Kommentar ist eigentlich eine Kopie einer Antwort (eher eine Nichtantwort), die ich 2010 gepostet habe . Ich habe die Antwort gelöscht, aber Jon Skeet hatte geantwortet : "Wenn man sich ECMA-262 ansieht, scheint es ziemlich genau spezifiziert zu sein."
Palswim

Antworten:

242

Gleich wie in anderen Sprachen:

  • ++x (Vorinkrementierung) bedeutet "Inkrementieren der Variablen; der Wert des Ausdrucks ist der Endwert"
  • x++ (Nachinkrementierung) bedeutet "Erinnere dich an den ursprünglichen Wert und erhöhe dann die Variable; der Wert des Ausdrucks ist der ursprüngliche Wert".

Wenn sie nun als eigenständige Anweisung verwendet werden, bedeuten sie dasselbe:

x++;
++x;

Der Unterschied entsteht, wenn Sie den Wert des Ausdrucks an anderer Stelle verwenden. Beispielsweise:

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

x = 0;
y = array[++x]; // This will get array[1]
Jon Skeet
quelle
13
Flüche, ich hätte dich fast zu einer Antwort geschlagen, hätte ich nicht aufgehört, eine praktische Antwort auf jsfiddle zu laden. ;-)
Chris
2
Wie würde das aussehen, wenn Sie + 1stattdessen verwenden würden ++? Gibt es eine Möglichkeit, vor oder nach dem Hinzufügen von Zahlen zu erhöhen?
Keavon
Ich würde gerne wissen warum, wenn Sie diese Operation ausführen const r1 = (x ++) + (x ++); Es wird nicht das erwartete Ergebnis gemäß Ihrem Beispiel erzielt.
Jean Jimenez
1
@ JeanJimenez: Nun, es liefert das Ergebnis, das ich erwarte. Wenn beispielsweise xmit 10 begonnen wird, ist der Wert von r121, was 10 + 11 ist. Der Wert des ersten x++Ausdrucks ist 10 und xwird auf 11 erhöht. Der Wert des zweiten x++Ausdrucks ist 11 und xwird auf 12 erhöht.
Jon Skeet
Lieber @JonSkeet, danke für diese superschnelle Antwort. Ich bin neu im Erlernen von JavaScript und meine Verwirrung ist, warum einer erhöht und der andere nicht.
Jean Jimenez
43
  • ++x erhöht den Wert, wertet ihn aus und speichert ihn.
  • x++ wertet den Wert aus, erhöht ihn und speichert ihn.
var n = 0, m = 0;

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

Beachten Sie, dass die Verwendung nach ++xMöglichkeit geringfügige Leistungsvorteile bietet, da Sie die Variable lesen, ändern, dann auswerten und speichern. Im Vergleich zum x++Operator, in dem Sie den Wert lesen, auswerten, ändern und dann speichern.

Justin Force
quelle
7

Soweit ich weiß, tun sie dasselbe, wenn Sie sie eigenständig verwenden. Wenn Sie versuchen, das Ergebnis als Ausdruck auszugeben, können sie unterschiedlich sein. Versuchen Sie alert (i ++) im Vergleich zu alert (++ i), um den Unterschied zu erkennen. i ++ wertet i vor dem Hinzufügen aus und ++ i führt das Hinzufügen vor dem Auswerten durch.

Ein Beispiel finden Sie unter http://jsfiddle.net/xaDC4/ .

Chris
quelle
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

Der Code-Typ
quelle
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
quelle
0

Ich habe eine Erklärung zum Verständnis von Post-Inkrement und Pre-Inkrement. Also lege ich es hierher.

Weisen wir 0zux

let x = 0;

Beginnen wir mit dem Nachinkrement

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

Warum?

Lassen Sie x++uns den Ausdruck aufschlüsseln

x = x;
x = x + 1;

Die erste Anweisung gibt den Wert zurück, der xist0

Und später, wenn Sie xirgendwo eine Variable verwenden, wird die zweite Anweisung ausgeführt

Die zweite Anweisung gibt den Wert dieses x + 1Ausdrucks zurück(0 + 1) = 1

Denken Sie an den Wert xin diesem Zustand1

Beginnen wir nun mit der Vorinkrementierung

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

Warum?

Lassen Sie ++xuns den Ausdruck aufschlüsseln

x = x + 1;
x = x;

Die erste Anweisung gibt den Wert dieses x + 1Ausdrucks zurück(1 + 1) = 2

Die zweite Anweisung gibt den Wert zurück, der xso ist, 2dass x = 2sie zurückgibt2

Ich hoffe, dies würde Ihnen helfen zu verstehen, was Post-Inkrement und Pre-Inkrement sind!

unclexo
quelle