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


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]

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.


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.


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!


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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.