在 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中文網其他相關文章!