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?

Jan 20, 2025 pm 06:51 PM

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:

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');
Salin selepas log masuk

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>
Salin selepas log masuk

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:

#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;
}
Salin selepas log masuk

Hasil output ialah:

<code>A is 20 and B is 10</code>
Salin selepas log masuk

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 Laman Web ini
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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Ganti aksara rentetan dalam javascript Ganti aksara rentetan dalam javascript Mar 11, 2025 am 12:07 AM

Ganti aksara rentetan dalam javascript

periksa jQuery jika tarikh sah periksa jQuery jika tarikh sah Mar 01, 2025 am 08:51 AM

periksa jQuery jika tarikh sah

jQuery mendapatkan padding/margin elemen jQuery mendapatkan padding/margin elemen Mar 01, 2025 am 08:53 AM

jQuery mendapatkan padding/margin elemen

10 Tab Accordion JQuery 10 Tab Accordion JQuery Mar 01, 2025 am 01:34 AM

10 Tab Accordion JQuery

10 patut diperiksa plugin jQuery 10 patut diperiksa plugin jQuery Mar 01, 2025 am 01:29 AM

10 patut diperiksa plugin jQuery

HTTP Debugging dengan Node dan HTTP-Console HTTP Debugging dengan Node dan HTTP-Console Mar 01, 2025 am 01:37 AM

HTTP Debugging dengan Node dan HTTP-Console

Tutorial Persediaan API Carian Google Custom Tutorial Persediaan API Carian Google Custom Mar 04, 2025 am 01:06 AM

Tutorial Persediaan API Carian Google Custom

jQuery tambah bar scroll ke div jQuery tambah bar scroll ke div Mar 01, 2025 am 01:30 AM

jQuery tambah bar scroll ke div

See all articles