++ someVariable vs someVariable ++ en JavaScript

136

En JavaScript, vous pouvez utiliser l' ++opérateur avant ( pré-incrémentation ) ou après le nom de la variable ( post-incrémentation ). Quelles sont, le cas échéant, les différences entre ces façons d'incrémenter une variable?

Derek Adair
la source
1
Voir aussi la différence
Bergi
J'y pensais hier en lisant cette réponse à la question sur les mauvaises hypothèses en C / C ++ . Dans tous les cas, pouvons-nous garantir que Javascript se comporte de cette façon? Ou pensez-vous que c'est une mauvaise pratique d'utiliser l'instruction d'incrémentation dans une instruction plus complexe?
palswim
Le commentaire précédent est en fait une copie d' une réponse (plutôt une non-réponse) que j'ai publiée en 2010 . J'ai supprimé la réponse, mais Jon Skeet avait répondu : "En regardant ECMA-262, il semble raisonnablement bien spécifié."
palswim

Réponses:

243

Idem que dans les autres langues:

  • ++x (pré-incrémentation) signifie "incrémenter la variable; la valeur de l'expression est la valeur finale"
  • x++ (post-incrémentation) signifie "mémoriser la valeur d'origine, puis incrémenter la variable; la valeur de l'expression est la valeur d'origine"

Maintenant, lorsqu'ils sont utilisés comme une déclaration autonome, ils signifient la même chose:

x++;
++x;

La différence vient lorsque vous utilisez la valeur de l'expression ailleurs. Par exemple:

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

x = 0;
y = array[++x]; // This will get array[1]
Jon Skeet
la source
13
Maudits, je vous ai presque battu à une réponse si je ne m'étais pas arrêté pour charger une réponse pratique de jsfiddle. ;-)
Chris
2
À quoi cela ressemblerait-il si vous utilisiez à la + 1place de ++? Existe-t-il un moyen d'incrémenter avant ou après lors de l'ajout de nombres?
Keavon
Je voudrais savoir pourquoi si vous faites cette opération const r1 = (x ++) + (x ++); il ne produit pas le résultat attendu selon votre exemple.
Jean Jimenez
1
@JeanJimenez: Eh bien, cela produit le résultat que j'attends. Par exemple, si xcommence par 10, la valeur de r1est 21, soit 10 + 11. La valeur de la première x++expression est 10 et xest incrémentée à 11. La valeur de la deuxième x++expression est 11 et xest incrémentée à 12.
Jon Skeet
Cher @JonSkeet, merci pour cette réponse ultra-rapide, je suis nouveau dans l'apprentissage de JavaScript et ma confusion concerne les raisons pour lesquelles l'un s'incrémente et l'autre pas.
Jean Jimenez
43
  • ++x incrémente la valeur, puis l'évalue et la stocke.
  • x++ évalue la valeur, puis l'incrémente et la stocke.
var n = 0, m = 0;

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

Notez que l'utilisation ++xlorsque cela est possible présente de légers avantages en termes de performances , car vous lisez la variable, la modifiez, puis l'évaluez et la stockez. Par rapport à l' x++opérateur où vous lisez la valeur, l'évaluez, la modifiez, puis la stockez.

Justin Force
la source
7

Si je comprends bien, si vous les utilisez de manière autonome, ils font la même chose. Si vous essayez d'en afficher le résultat sous forme d'expression, ils peuvent différer. Essayez alert (i ++) par rapport à alert (++ i) pour voir la différence. i ++ évalue i avant l'addition et ++ i fait l'addition avant d'évaluer.

Voir http://jsfiddle.net/xaDC4/ pour un exemple.

Chris
la source
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

Le gars du code
la source
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
la source
0

J'ai une explication de la compréhension de la post-incrémentation et de la pré-incrémentation. Alors je le mets ici.

Permet d'assigner 0àx

let x = 0;

Commençons par post-incrémentation

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

Pourquoi?

Permet de décomposer l' x++expression

x = x;
x = x + 1;

La première instruction renvoie la valeur de xlaquelle est0

Et plus tard, lorsque vous utilisez une xvariable n'importe où, la deuxième instruction est exécutée

La deuxième instruction renvoie la valeur de cette x + 1expression qui est(0 + 1) = 1

Gardez à l'esprit la valeur de xcet état qui est1

Commençons maintenant par le pré-incrément

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

Pourquoi?

Permet de décomposer l' ++xexpression

x = x + 1;
x = x;

La première instruction renvoie la valeur de cette x + 1expression qui est(1 + 1) = 2

La deuxième instruction renvoie la valeur xdont il est 2ainsi x = 2donc elle renvoie2

J'espère que cela vous aidera à comprendre ce que sont la post-incrémentation et la pré-incrémentation!

unclexo
la source