++ someVariable ve someVariable ++ ile JavaScript'te


136

JavaScript'te ++operatörü değişken adından önce ( artış öncesi ) veya sonra kullanabilirsiniz ( artış sonrası ). Varsa bu değişkeni artırmanın yolları arasındaki farklar nelerdir?



Dün C / C ++ 'daki kötü varsayımlar hakkındaki soruya bu yanıtı okurken bunu düşünüyordum . Her durumda, Javascript'in bu şekilde davrandığını garanti edebilir miyiz? Yoksa artış ifadesini daha karmaşık bir ifadede kullanmanın kötü bir uygulama olduğunu mu düşünüyorsunuz?
palswim

Önceki yorum aslında 2010 yılında gönderdiğim bir yanıtın ( daha çok cevapsız) bir kopyasıdır . Cevabı sildim, ancak Jon Skeet şöyle cevap verdi : "ECMA-262'ye baktığımızda, oldukça iyi tanımlanmış görünüyor."
19'da palswim

Yanıtlar:


243

Diğer dillerde aynı:

  • ++x (ön artış) "değişkeni artır; ifadenin değeri son değerdir" anlamına gelir
  • x++ (artım sonrası) "orijinal değeri hatırlayın, ardından değişkeni artırın; ifadenin değeri orijinal değerdir" anlamına gelir

Şimdi bağımsız bir ifade olarak kullanıldığında, aynı anlama geliyorlar:

x++;
++x;

Fark, ifadenin değerini başka bir yerde kullandığınızda ortaya çıkar. Örneğin:

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

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

13
Lanetler, pratik bir jsfiddle cevabı yüklemek için durmamış olsaydım sizi neredeyse bir cevaba yendim ;-)
Chris

2
Bunun + 1yerine kullandıysan bu nasıl olurdu ++? Sayı eklerken önce veya sonra artırmanın bir yolu var mı?
Keavon

Neden bu işlemi yaparsanız const r1 = (x ++) + (x ++) bilmek istiyorum; örneğinize göre beklenen sonucu vermez.
Jean Jimenez

1
@JeanJimenez: Peki sonuç üretir Ben bekliyoruz. Örneğin, x10 olarak başlarsa, değeri r121, yani 10 + 11'dir. İlk x++ifadenin değeri 10'dur ve x11'e çıkar. İkinci x++ifadenin değeri 11'dir ve x12'ye çıkarılmıştır.
Jon Skeet

Sevgili @JonSkeet bu süper hızlı yanıt için teşekkürler, JavaScript öğrenmeye yeni başladım ve karışıklığım neden bir artışın diğerinin neden artmadığıyla ilgili.
Jean Jimenez

43
  • ++x değeri artırır, değerlendirir ve saklar.
  • x++ değeri değerlendirir, sonra artırır ve kaydeder.
var n = 0, m = 0;

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

++xDeğişkeni okuduğunuz, değiştirdiğiniz, sonra değerlendirip sakladığınız için mümkün olan yerlerde kullanmanın küçük performans avantajları olduğunu unutmayın . Karşı x++sen değerini okumak değerlendirmek operatörü değiştirmek, daha sonra saklayın.


7

Onları anladığım gibi, bağımsız olarak kullanırsanız aynı şeyi yaparlar. Sonuçlarını bir ifade olarak çıkarmaya çalışırsanız, farklı olabilirler. Farkı görmek için alert (++ i) ile karşılaştırıldığında alert (i ++) öğesini deneyin. i ++ eklemeden önce i değerini değerlendirir ve ++ i değerlendirmeden önce eklemeyi yapar.

Örnek için http://jsfiddle.net/xaDC4/ adresine bakın .


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

Artım sonrası ve artım öncesi anlayışlarımın bir açıklaması var. Bu yüzden buraya koyuyorum.

Şuna atayalım 0:x

let x = 0;

Artış sonrası ile başlayalım

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

Neden?

Kırmak Sağlar x++ifade aşağı

x = x;
x = x + 1;

İlk ifade, değeri xolan0

Ve daha sonra xherhangi bir yerde değişken kullandığınızda , ikinci ifade yürütülür

İkinci ifade, bu x + 1ifadenin değerini döndürür.(0 + 1) = 1

xŞu durumda olan değeri aklınızda bulundurun :1

Şimdi ön artışla başlayalım

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

Neden?

Kırmak Sağlar ++xifade aşağı

x = x + 1;
x = x;

İlk ifade, bu x + 1ifadenin değerini döndürür.(1 + 1) = 2

İkinci deyim değerini verir xki 2böylece x = 2böylece döner2

Bu artışın ve artışın ne olduğunu anlamanıza yardımcı olacağını umuyoruz!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.