++ someVariable vs. someVariable ++ in JavaScript


135

In JavaScript è possibile utilizzare l' ++operatore prima ( pre-incremento ) o dopo il nome della variabile ( post-incremento ). Quali eventuali differenze ci sono tra questi modi di incrementare una variabile?


1
Vedi anche la differenza indipendente
Bergi,

Ci ho pensato ieri leggendo questa risposta alla domanda sui cattivi presupposti in C / C ++ . In tutti i casi, possiamo garantire che Javascript si comporti in questo modo? O pensi che sia una cattiva pratica usare l'istruzione incrementale all'interno di un'istruzione più complessa?
Palswim,

Il commento precedente è in realtà una copia di una risposta (una non risposta, piuttosto) che ho pubblicato nel 2010 . Ho cancellato la risposta, ma Jon Skeet aveva risposto : "Guardando l'ECMA-262, sembra ragionevolmente ben specificato."
Palswim,

Risposte:


242

Come in altre lingue:

  • ++x (pre-incremento) significa "incrementa la variabile; il valore dell'espressione è il valore finale"
  • x++ (post-incremento) significa "ricorda il valore originale, quindi incrementa la variabile; il valore dell'espressione è il valore originale"

Ora, se usati come dichiarazioni autonome, significano la stessa cosa:

x++;
++x;

La differenza viene quando si utilizza il valore dell'espressione altrove. Per esempio:

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

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

13
Maledizione, ti ho quasi battuto per una risposta se non mi fossi fermato a caricare una pratica risposta da jsfiddle. ;-)
Chris,

2
Come sarebbe se lo usassi + 1invece di ++? C'è un modo per aumentare prima o dopo l'aggiunta di numeri?
Keavon,

Vorrei sapere perché se si esegue questa operazione const r1 = (x ++) + (x ++); non produce il risultato atteso secondo il tuo esempio.
Jean Jimenez,

1
@JeanJimenez: Beh, produce il risultato che mi aspetto. Ad esempio, se xinizia come 10, il valore di r1è 21, ovvero 10 + 11. Il valore della prima x++espressione è 10 ed xè incrementato a 11. Il valore della seconda x++espressione è 11 ed xè incrementato a 12.
Jon Skeet

Caro @JonSkeet grazie per la risposta super veloce, sono nuovo nell'apprendimento di JavaScript e la mia confusione riguarda il motivo per cui uno aumenta e l'altro no.
Jean Jimenez,

43
  • ++x incrementa il valore, quindi lo valuta e lo memorizza.
  • x++ valuta il valore, quindi lo incrementa e lo memorizza.
var n = 0, m = 0;

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

Si noti che ci sono lievi vantaggi in termini di prestazioni ++xquando possibile, poiché si legge la variabile, la si modifica, quindi si valuta e si memorizza. Contro l' x++operatore in cui leggi il valore, lo valuti, lo modifichi, quindi lo memorizzi.


7

Se li capisco, se li usi da soli, fanno la stessa cosa. Se si tenta di generare il risultato come espressione, potrebbero differire. Prova avviso (i ++) rispetto all'avviso (++ i) per vedere la differenza. i ++ valuta i prima dell'aggiunta e ++ i fa l'aggiunta prima della valutazione.

Vedi http://jsfiddle.net/xaDC4/ per un esempio.


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


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

0

Ho una spiegazione della comprensione post-incremento e pre-incremento. Quindi lo sto mettendo qui.

Consente di assegnare 0ax

let x = 0;

Iniziamo con il post-incremento

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

Perché?

Consente di suddividere l' x++espressione

x = x;
x = x + 1;

La prima istruzione restituisce il valore di xcui è0

E più tardi, quando usi la xvariabile ovunque, viene eseguita la seconda istruzione

La seconda istruzione restituisce il valore di questa x + 1espressione che è(0 + 1) = 1

Tieni presente il valore di xquesto stato che è1

Ora cominciamo con il pre-incremento

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

Perché?

Consente di suddividere l' ++xespressione

x = x + 1;
x = x;

La prima istruzione restituisce il valore di questa x + 1espressione che è(1 + 1) = 2

In secondo luogo istruzione restituisce il valore xche è 2così x = 2quindi restituisce2

Spero che questo possa aiutarti a capire cosa sono post-incremento e pre-incremento!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.