首頁 >web前端 >js教程 >JavaScript 如何處理原始型別和物件的值傳遞和參考傳遞?

JavaScript 如何處理原始型別和物件的值傳遞和參考傳遞?

Patricia Arquette
Patricia Arquette原創
2024-12-18 12:54:11956瀏覽

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

JavaScript 值傳遞與引用傳遞

在 JavaScript 中,所有變數都是按值傳遞,這表示原始值的副本被建立並傳遞給函數。但是,當值是物件(例如陣列或物件字面量)時,副本是對原始物件的參考。

對函數參數的影響

  • 原語: 當原語(例如數字、字串)傳遞給函數時,對函數所做的任何更改函數內的值僅限於函數的局部範圍,不會影響函數外部的原始變數。
  • 物件參考:當物件參考傳遞給函數時,函數內對物件屬性所做的變更會反映在原始物件中,甚至在函數外部也是如此。

對外部變數的影響函數

  • 按引用傳遞:物件引用透過引用傳遞,這表示在函數內對物件屬性所做的變更將影響原始物件的屬性,但函數內對參考本身所做的任何變更(例如重新指派)不會影響原始參考變數。
  • 以值傳遞:按值傳遞的原始值和物件參考不會影響函數外部的原始變數。

範例

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

在上面的範例中,b 和c 物件的變更反映在

深入範例:

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)
}

在第一個範例中,即使 a已被修改, b 仍然保留原始值,因為它是引用的副本。

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)
}

在第二個範例中,改為a[1].red 會影響 a 和 b,因為它們共用相同的物件參考。

建立獨立副本

要建立物件的完全獨立副本,您可以使用JSON.parse() 和JSON.stringify() 方法分別反序列化和序列化對象。例如:

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

以上是JavaScript 如何處理原始型別和物件的值傳遞和參考傳遞?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn