2010-08-12 5 views
86

In Javascript è possibile utilizzare l'operatore ++ prima o dopo il nome della variabile. Quali sono le differenze tra questi modi di incrementare una variabile?++ some Varianble vs. someVariable ++ in Javascript

+0

Vedi anche la lingua-agnostic [Differenza tra i ++ e ++ i in un ciclo?] (Http://stackoverflow.com/q/484462/1048572) – Bergi

risposta

145

Uguale in altre lingue:

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

Ora, quando viene utilizzato come una dichiarazione standalone, che 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] 
+4

Maledizioni , Ti ho quasi picchiato a una risposta se non avessi smesso di caricare una risposta pratica di jsfiddle. ;-) – Chris

+2

Che aspetto avrebbe questo se usassi '+ 1' invece di' ++ '? C'è un modo per aumentare prima o dopo l'aggiunta di numeri? – Keavon

+0

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

6

Mi pare di capire se li si utilizza standalone che fanno la stessa cosa. Se provi a generare il risultato di essi come espressione, possono differire. Prova alert (i ++) rispetto all'avviso (++ i) per vedere la differenza. i ++ valuta i prima dell'aggiunta e ++ i fa l'aggiunta prima di valutare.

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

20
  • ++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 */ 

Nota che ci sono lievi vantaggi prestazionali di utilizzare ++x, ove possibile, a causa di leggere la variabile, modificarlo, quindi valutare e conservarla. Contro l'operatore x++ in cui leggi il valore, lo valuti, lo modifichi, quindi lo memorizzi.

1

stavo pensando a questo ieri leggendo this response alla domanda su bad assumptions in C/C++. In tutti i casi, possiamo garantire che Javascript si comporti in questo modo? O pensi che sia una cattiva pratica usare la dichiarazione di incremento in un'istruzione più complessa?

+1

Guardando all'ECMA-262, sembra ragionevolmente ben specificato. –

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