淺拷貝 vs. 深拷貝 (Shallow Copy vs. Deep Copy) | Javascript

JavaScript 中,複製對象和陣列是一個常見的任務,但複製的方法可能導致意外的行為。淺拷貝和深拷貝是兩種不同的方法,各自具有其優勢和用例。

淺拷貝:

淺拷貝創建一個新的對象或陣列,並複製原始對象的頂級結構。
但是,如果原始對象包含嵌套的對象或陣列,它們仍然被引用,而不是複製。
對拷貝中嵌套結構的更改將影響原始對象,反之亦然。

  • 如果object 或 Array 裡面還有Reference Type數據的話,一樣會被影響
  • 淺拷貝只適合object 或 Array裡面只有一層的object
const originalArray = [1, 2, [3, 4]];
const shallowCopyArray = [...originalArray];

shallowCopyArray[2][0] = 99;
console.log(originalArray[2][0]); // 99 (兩個陣列共享相同的引用)

深拷貝:

另一方面,深拷貝創建原始對象或陣列的完全獨立副本,包括所有嵌套結構。
對深拷貝進行的更改不會影響原始對象,確保完全獨立性。

  • 將物件轉成字串再轉成物件,這樣就可以確保複製出來的會是一個新的物件而且是使用不同的記憶體。
const originalObject = { a: 1, b: { c: 2 } };
const deepCopyObject = JSON.parse(JSON.stringify(originalObject));

deepCopyObject.b.c = 99;
console.log(originalObject.b.c); // 2 (深拷貝保持獨立性)

選擇正確的拷貝方法:

在淺拷貝和深拷貝之間的選擇取決於應用程序的具體要求。
當可以接受共享引用時,淺拷貝是可以快速使用的。
而深拷貝則是使用上比較複雜和消耗記憶體,但是可以讓複製出來的物件確保有獨立性。

特別注意:

需要注意的是,使用 JSON 序列化和解析的方法有一些局限性。
比如無法處理包含函數、RegExp 等特殊類型的對象。
在實際應用中,你可能需要根據你的數據結構和需求選擇適當的深拷貝方法。