++ someVariable vs. someVariable ++ di JavaScript

140

Dalam JavaScript Anda dapat menggunakan ++operator sebelum ( kenaikan awal ) atau setelah nama variabel ( kenaikan pasca ). Apa, jika ada, perbedaan antara cara menaikkan variabel ini?

Derek Adair
sumber
1
Lihat juga perbedaan bahasa-agnostik antara i ++ dan ++ i dalam satu lingkaran?
Bergi
Saya sedang memikirkan tentang ini kemarin membaca jawaban ini untuk pertanyaan tentang asumsi buruk di C / C ++ . Dalam semua kasus, dapatkah kami menjamin bahwa JavaScript berperilaku seperti ini? Atau menurut Anda, apakah menggunakan pernyataan increment dalam pernyataan yang lebih kompleks merupakan praktik yang buruk?
palswim
Komentar sebelumnya sebenarnya adalah salinan dari jawaban (bukan jawaban, lebih tepatnya) yang saya posting pada tahun 2010 . Saya telah menghapus jawabannya, tetapi Jon Skeet menjawab dengan: "Melihat ECMA-262, tampaknya cukup ditentukan dengan baik."
palswim

Jawaban:

256

Sama seperti di bahasa lain:

  • ++x (pre-increment) berarti "increment variabel; nilai ekspresi adalah nilai akhir"
  • x++ (post-increment) berarti "ingat nilai asli, lalu tambahkan variabel; nilai ekspresi adalah nilai asli"

Sekarang ketika digunakan sebagai pernyataan mandiri, artinya sama:

x++;
++x;

Perbedaannya muncul saat Anda menggunakan nilai ekspresi di tempat lain. Sebagai contoh:

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

x = 0;
y = array[++x]; // This will get array[1]
Jon Skeet
sumber
14
Sialan, saya hampir mengalahkan Anda untuk sebuah jawaban seandainya saya tidak berhenti untuk memuat jawaban jsfiddle praktis. ;-)
Chris
2
Akan terlihat seperti apa jika Anda menggunakan, + 1bukan ++? Apakah ada cara untuk menambah sebelum atau sesudah saat menambahkan angka?
Keavon
Saya ingin tahu mengapa jika Anda melakukan operasi ini const r1 = (x ++) + (x ++); itu tidak menghasilkan hasil yang diharapkan sesuai dengan contoh Anda.
Jean Jimenez
2
@JeanJimenez: Itu menghasilkan hasil yang saya harapkan. Misalnya, jika xdimulai sebagai 10, nilai dari r1adalah 21, yaitu 10 + 11. Nilai x++ekspresi pertama adalah 10 dan xbertambah menjadi 11. Nilai x++ekspresi kedua adalah 11 dan xbertambah menjadi 12.
Jon Skeet
@JonSkeet yang terhormat, terima kasih atas respons super cepatnya, saya baru mempelajari JavaScript dan kebingungan saya adalah tentang mengapa yang satu naik dan yang lainnya tidak.
Jean Jimenez
48
  • ++x menambah nilai, lalu mengevaluasi dan menyimpannya.
  • x++ mengevaluasi nilai, lalu menambah dan menyimpannya.
var n = 0, m = 0;

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

Perhatikan bahwa ada sedikit manfaat performa untuk digunakan ++xjika memungkinkan, karena Anda membaca variabel, mengubahnya, lalu mengevaluasi dan menyimpannya. Dibandingkan dengan x++operator tempat Anda membaca nilai, mengevaluasinya, memodifikasinya, lalu menyimpannya.

Justin Force
sumber
8

Seperti yang saya pahami jika Anda menggunakannya secara mandiri, mereka melakukan hal yang sama. Jika Anda mencoba menampilkan hasilnya sebagai ekspresi maka hasilnya mungkin berbeda. Coba alert (i ++) dibandingkan dengan alert (++ i) untuk melihat perbedaannya. i ++ mengevaluasi ke i sebelum penambahan dan ++ i melakukan penambahan sebelum mengevaluasi.

Lihat http://jsfiddle.net/xaDC4/ sebagai contoh.

Chris
sumber
3

Saya memiliki penjelasan tentang pemahaman setelah kenaikan dan kenaikan awal. Jadi saya taruh di sini.

Ayo tetapkan 0kex

let x = 0;

Mari kita mulai dengan kenaikan pasca

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

Mengapa?

Mari kita hancurkan x++ekspresi itu

x = x;
x = x + 1;

Pernyataan pertama mengembalikan nilai xyang adalah0

Dan nanti ketika Anda menggunakan xvariabel di mana saja, maka pernyataan kedua dijalankan

Pernyataan kedua mengembalikan nilai dari x + 1ekspresi ini yaitu(0 + 1) = 1

Ingatlah nilai xpada keadaan ini yaitu1

Sekarang mari kita mulai dengan kenaikan sebelumnya

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

Mengapa?

Mari kita hancurkan ++xekspresi itu

x = x + 1;
x = x;

Pernyataan pertama mengembalikan nilai dari x + 1ekspresi ini yaitu(1 + 1) = 2

Pernyataan kedua mengembalikan nilai xyang 2jadi x = 2demikian ia kembali2

Semoga ini dapat membantu Anda memahami apa itu kenaikan pasca dan kenaikan awal!

unclexo
sumber
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.dll

The Code Guy
sumber
1
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
cacoder
sumber