155 votes

++someVariable vs. someVariable++ en JavaScript

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

1 votes

Voir également la version agnostique de la langue Différence entre i++ et ++i dans une boucle ?

0 votes

Je pensais à cela hier en lisant cette réponse à la question sur mauvaises hypothèses en C/C++ . Dans tous les cas, pouvons-nous garantir que Javascript se comporte de cette manière ? Ou pensez-vous que l'utilisation de l'instruction d'incrémentation au sein d'une instruction plus complexe soit une mauvaise pratique ?

0 votes

Le commentaire précédent est en fait une copie de une réponse (une non-réponse, plutôt) que j'ai postée en 2010 . J'ai supprimé la réponse, mais Jon Skeet avait répondu avec : "En regardant l'ECMA-262, cela semble raisonnablement bien spécifié."

282voto

Jon Skeet Points 692016

Comme dans les autres langues :

  • ++x (pré-incrément) signifie "incrémenter la variable ; la valeur de l'expression est la valeur finale".
  • x++ (post-incrément) signifie "se souvenir de la valeur originale, puis incrémenter la variable ; la valeur de l'expression est la valeur originale".

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]

15 votes

Malédiction, j'ai failli vous battre pour une réponse si je ne m'étais pas arrêté pour charger une réponse pratique de jsfiddle ;-)

2 votes

A quoi cela ressemblerait-il si vous utilisiez + 1 au lieu de ++ ? Existe-t-il un moyen d'incrémenter avant ou après lors de l'addition de nombres ?

0 votes

Je voudrais savoir pourquoi si vous faites cette opération const r1 =(x++)+(x++) ; cela ne donne pas le résultat attendu selon votre exemple.

58voto

sidewaysmilk Points 1872
  • ++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 qu'il y a de légers avantages en termes de performances à utiliser ++x lorsque cela est possible, car vous lisez la variable, la modifiez, puis l'évaluez et la stockez. Par rapport à la x++ où vous lisez la valeur, l'évaluez, la modifiez, puis la stockez.

9voto

Chris Points 15358

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

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

4voto

unclexo Points 1415

J'ai une explication pour comprendre la post-incrémentation et la pré-incrémentation. Je la mets donc ici.

Attribuons 0 à x

let x = 0;

Commençons par la post-incrémentation

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

Pourquoi ?

Cassons le x++ expression en baisse

x = x;
x = x + 1;

La première instruction renvoie la valeur de x qui est 0

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

La deuxième déclaration renvoie la valeur de ce x + 1 l'expression qui est (0 + 1) = 1

Gardez à l'esprit la valeur de x à cet état qui est 1

Commençons par la préincrémentation

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

Pourquoi ?

Cassons le ++x expression en baisse

x = x + 1;
x = x;

La première déclaration renvoie la valeur de cette x + 1 l'expression qui est (1 + 1) = 2

La deuxième instruction renvoie la valeur de x qui est 2 donc x = 2 il renvoie donc 2

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

2voto

The Code Guy Points 161
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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X