Rumah >hujung hadapan web >tutorial js >Bagaimanakah JavaScript Mengendalikan Pass-by-Value dan Pass-by-Reference dengan Jenis dan Objek Primitif?

Bagaimanakah JavaScript Mengendalikan Pass-by-Value dan Pass-by-Reference dengan Jenis dan Objek Primitif?

Patricia Arquette
Patricia Arquetteasal
2024-12-18 12:54:11955semak imbas

How Does JavaScript Handle Pass-by-Value and Pass-by-Reference with Primitive Types and Objects?

JavaScript Pass-by-Value vs. Pass-by-Reference

Dalam JavaScript, semua pembolehubah diluluskan mengikut nilai, yang bermaksud salinan nilai asal dibuat dan dihantar ke fungsi. Walau bagaimanapun, apabila nilai ialah objek, seperti tatasusunan atau literal objek, salinan tersebut adalah rujukan kepada objek asal.

Kesan pada Argumen Fungsi

  • Primitif: Apabila primitif (cth., nombor, rentetan) dihantar ke fungsi, sebarang perubahan dibuat padanya nilai dalam fungsi adalah terhad kepada skop tempatan fungsi dan tidak menjejaskan pembolehubah asal di luar fungsi.
  • Rujukan Objek: Apabila rujukan objek dihantar kepada fungsi, berubah dibuat kepada sifat objek dalam fungsi dipantulkan dalam objek asal, walaupun di luar fungsi.

Kesan ke atas Pembolehubah Di Luar Fungsi

  • Pass-by-Reference: Rujukan objek diluluskan melalui rujukan, bermakna perubahan yang dibuat pada sifat objek dalam fungsi akan mempengaruhi sifat objek asal, tetapi sebarang perubahan yang dibuat pada rujukan itu sendiri (cth., penugasan semula) dalam fungsi tidak menjejaskan yang asal pembolehubah.
  • Nilai Laluan: Nilai primitif dan rujukan objek yang diluluskan oleh nilai tidak menjejaskan pembolehubah asal di luar fungsi.

Contoh

function f(a, b, c) {
  a = 3; // Reassignment changes the local variable only.
  b.push("foo"); // Property change affects the original object.
  c.first = false; // Property change affects the original object.
}

const x = 4;
let y = ["eeny", "miny", "mo"];
let z = { first: true };
f(x, y, z);

console.log(x, y, z.first); // Output: 4, ["eeny", "miny", "mo", "foo"], false

Dalam contoh di atas, perubahan pada objek b dan c ialah dicerminkan dalam objek asal, manakala penugasan semula a tidak mempunyai kesan.

Contoh Mendalam:

function f() {
  const a = ["1", "2", { foo: "bar" }];
  const b = a[1]; // Copy the reference to the original array element
  a[1] = "4"; // Change the value in the original array
  console.log(b); // Output: "2" (Original value of the copied reference)
}

Dalam contoh pertama, walaupun a mempunyai telah diubah suai, b masih memegang nilai asal kerana ia adalah salinan rujukan.

function f() {
  const a = [{ yellow: "blue" }, { red: "cyan" }, { green: "magenta" }];
  const b = a[1]; // Copy the reference to the original object
  a[1].red = "tan"; // Change the property in the original object
  console.log(b.red); // Output: "tan" (Property change is reflected in both variables)
  b.red = "black"; // Change the property through the reference
  console.log(a[1].red); // Output: "black" (Property change is reflected in both variables)
}

Dalam contoh kedua, perubahan kepada a[1].red mempengaruhi kedua-dua a dan b kerana ia berkongsi rujukan objek yang sama.

Mencipta Salinan Bebas

Untuk mencipta salinan bebas sepenuhnya bagi objek, anda boleh menggunakan kaedah JSON.parse() dan JSON.stringify() untuk menyahsiri dan mensirikan objek masing-masing. Contohnya:

const originalObject = { foo: "bar" };
const independentCopy = JSON.parse(JSON.stringify(originalObject));

Atas ialah kandungan terperinci Bagaimanakah JavaScript Mengendalikan Pass-by-Value dan Pass-by-Reference dengan Jenis dan Objek Primitif?. 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