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