2010-08-12 10 views

Odpowiedz

145

samo jak w innych językach:

  • ++x (preinkrementuj) oznacza „zwiększamy zmienną, wartość wyrażenia jest wartość końcowa”
  • x++ (postinkrementacja) oznacza „Pamiętaj pierwotnej wartości, a następnie zwiększamy zmienną; wartość wyrażenia jest wartość początkowa”

teraz kiedy jest stosowany jako samodzielny oświadczeniu, oznacza, że ​​to samo:

x++; 
++x; 

Różnica pojawia się, gdy używana jest wartość wyrażenia w innym miejscu. Na przykład:

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

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

Curses , Prawie pobiłem cię do odpowiedzi, gdybym nie zatrzymał się, by załadować praktyczną odpowiedź jsfiddle. ;-) – Chris

+2

Co by to wyglądało, gdybyś użył '+ 1' zamiast' ++ '? Czy istnieje sposób zwiększania wartości przed lub po dodawaniu liczb? – Keavon

+0

Chciałbym wiedzieć, dlaczego jeśli wykonasz tę operację const r1 = (x ++) + (x ++); nie daje oczekiwanego rezultatu według twojego przykładu. –

6

Jak rozumiem, jeśli używasz ich samodzielnie, robią to samo. Jeśli spróbujesz wyprowadzić wynik ich jako wyrażenie, wtedy mogą się one różnić. Wypróbuj alert (i ++) w porównaniu z alertem (++ i), aby zobaczyć różnicę. i ++ ocenia do i przed dodaniem i ++ i robi dodawanie przed oceną.

Zobacz przykład http://jsfiddle.net/xaDC4/.

20
  • ++x zwiększa wartość, a następnie ją ocenia i zapisuje.
  • x++ oblicza wartość, a następnie zwiększa ją i przechowuje.
var n = 0, m = 0; 

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

pamiętać, że istnieją niewielkie korzyści wydajności do korzystania ++x gdzie to możliwe, ponieważ odczytu zmiennej, zmodyfikować go, a następnie ocenić i zapisać go. W odróżnieniu od operatora x++, w którym odczytujemy wartość, oceniamy ją, modyfikujemy, a następnie przechowujemy.

1

Myślałem o tym wczoraj czytając this response na pytanie o bad assumptions in C/C++. Czy w każdym przypadku możemy zagwarantować, że JavaScript zachowuje się w ten sposób? Czy uważasz, że niewłaściwą praktyką jest używanie w ogóle instrukcji increment w bardziej złożonej instrukcji?

+1

Patrząc na ECMA-262, wydaje się dość dobrze określony. –

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