Rumah >hujung hadapan web >tutorial js >Pass By Value vs Pass By Rujukan, Adakah Ia Penting?
Lulus mengikut nilai berbanding rujukan lulus: perbincangan mendalam
Dalam temu bual teknikal pertama saya, saya ditanya soalan ini: Apakah perbezaan antara lulus mengikut nilai dan lulus melalui rujukan? Jawapan saya ialah: Lulus dengan nilai melepasi nilai, lulus dengan rujukan melepasi rujukan. Walaupun jawapan ini asas dan juga dangkal, ia tidak sepenuhnya salah dan hanya memerlukan penjelasan lanjut.
Lulus nilai: Nilai pembolehubah disalin dan dihantar ke fungsi sebagai parameter. Fungsi menggunakan nilai yang disalin ini untuk melaksanakan pelbagai operasi, dan nilai pembolehubah asal kekal tidak berubah . Hampir semua bahasa pengaturcaraan yang diketahui, termasuk JavaScript dan Java, menggunakan nilai lulus.
Melalui rujukan: Rujukan merujuk kepada pembolehubah yang menunjuk kepada nilai dalam ingatan. Anggap ia sebagai penunjuk. Ia dihantar ke fungsi sebagai parameter dan ia diberikan alias (rujukan alias) menggunakan parameter. Fungsi melakukan pelbagai operasi menggunakan parameter ini, yang menyediakan akses kepada lokasi memori nilai. Oleh itu, sebarang operasi menggunakan parameter ini akan menjejaskan nilai pembolehubah asal dan nilai pembolehubah asal akan diubah. Hanya beberapa bahasa pengaturcaraan menggunakan rujukan lulus, contohnya C mempunyai keupayaan ini, tetapi walaupun dalam C mod lalai adalah lulus mengikut nilai.
Contoh lulus nilai:
Contoh berikut menggunakan JavaScript, yang mengikut ketat penghantaran nilai, tidak kira sama ada ia jenis primitif atau jenis rujukan (objek). Berikut ialah contoh klasik fungsi swap:
<code class="language-javascript">const firstPrimitive = 1; //传递给firstArgument的原始值 const secondPrimitive = 2; //传递给secondArgument的原始值 const firstObject = {name: "first", reason: "Test pass-by-value"}; //传递给firstArgument的对象 const secondObject = {name: "second", reason: "Test pass-by-value"}; //传递给secondArgument的对象 function swap(firstArgument, secondArgument){ const placeholder = secondArgument; secondArgument = firstArgument; firstArgument = placeholder; console.log('当前位于函数内部。'); console.log('firstArgument = ', firstArgument, ', secondArgument = ', secondArgument, '\n'); } console.log('函数执行前。'); console.log('firstPrimitive = ', firstPrimitive, ', secondPrimitive =', secondPrimitive); console.log('firstObject = ', firstObject, ', secondObject =', secondObject, '\n'); swap(firstPrimitive, secondPrimitive); console.log('当前位于函数外部。'); console.log('firstPrimitive = ', firstPrimitive, ', secondPrimitive =', secondPrimitive, '\n'); swap(firstObject, secondObject) console.log('当前位于函数外部。'); console.log('firstObject = ', firstObject, ', secondObject =', secondObject, '\n');</code>
Selepas melaksanakan kod ini, hasilnya adalah seperti berikut:
<code>函数执行前。 firstPrimitive = 1 , secondPrimitive = 2 firstObject = { name: 'first', reason: 'Test pass-by-value' } , secondObject = { name: 'second', reason: 'Test pass-by-value' } 当前位于函数内部。 firstArgument = 2 , secondArgument = 1 当前位于函数外部。 firstPrimitive = 1 , secondPrimitive = 2 当前位于函数内部。 firstArgument = { name: 'second', reason: 'Test pass-by-value' } , secondArgument = { name: 'first', reason: 'Test pass-by-value' } 当前位于函数外部。 firstObject = { name: 'first', reason: 'Test pass-by-value' } , secondObject = { name: 'second', reason: 'Test pass-by-value' }</code>
Perhatikan bahawa di dalam fungsi swap, kedua-dua nilai ditukar; namun, di luar fungsi, nilainya tetap sama.
Contoh lulus melalui rujukan:
Contoh berikut menggunakan C dan boleh dilaksanakan dengan lulus melalui rujukan. Ini boleh dicapai menggunakan operator alamat (&). Sekali lagi, ia menggunakan versi fungsi swap:
<code class="language-c++">#include <stdio.h> void swap(int &i, int &j) { int temp = i; i = j; j = temp; } int main(void) { int a = 10; int b = 20; swap(a, b); printf("A is %d and B is %d\n", a, b); return 0; }</code>
Hasil output ialah:
<code>A is 20 and B is 10</code>
Di sini nilai a dan b ditukar kerana ia digunakan sebagai rujukan.
Ringkasan: Lulus melalui rujukan bermakna fungsi menerima alamat memori pembolehubah (melalui rujukan), membenarkannya mengubah suai pembolehubah asal secara langsung manakala nilai lulus bermaksud salinan pembolehubah nilai diluluskan tanpa mengubah suai pembolehubah asal.
Adakah ini penting?
Kebanyakan bahasa pengaturcaraan menggunakan nilai lulus, dan kami nampaknya tidak mempunyai pilihan. Jadi, bagaimana ini terpakai? Inilah yang saya temui:
Komen dialu-alukan. Terima kasih.
Bahan rujukan: Adakah JavaScript lulus dengan rujukan? Lulus rujukan (C sahaja)
Atas ialah kandungan terperinci Pass By Value vs Pass By Rujukan, Adakah Ia Penting?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!