Rumah >hujung hadapan web >tutorial js >Pass By Value vs Pass By Rujukan, Adakah Ia Penting?

Pass By Value vs Pass By Rujukan, Adakah Ia Penting?

Susan Sarandon
Susan Sarandonasal
2025-01-20 18:51:08476semak imbas

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.

Pass By Value vs. Pass By Reference, Does It Matter?

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.

Pass By Value vs. Pass By Reference, Does It Matter?

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:

  • Gunakan nilai lulus apabila anda hanya "menggunakan" parameter untuk melakukan beberapa pengiraan tanpa mengubahnya untuk program klien.
  • Gunakan rujukan lulus apabila anda memerlukan fungsi untuk mengubah suai nilai asal pembolehubah yang diluluskan sebagai hujah, kerana ia beroperasi secara langsung pada lokasi memori pembolehubah dan bukannya mencipta salinan, yang menjadikannya lebih cekap, terutamanya apabila berurusan dengan struktur data yang besar (seperti objek atau tatasusunan yang kompleks); ia mengelakkan overhed menyalin data dan membenarkan pembolehubah asal ditukar terus di dalam fungsi. Melalui rujukan boleh meningkatkan prestasi.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn