logo-yuki

Yuki

Post

とうこう

什麼是深拷貝、淺拷貝?以 JavaScript 為例。

複製一個物件、改了新的、原本的也跟著變——這個坑你也踩過嗎?

少於 1 分鐘
✦interview-preparation

用 spread 複製物件,改了巢狀的東西結果原本也被改⋯⋯

淺拷貝只複製第一層,這就是代價。

這篇建立在 by reference 的概念上,還不熟的話可以先看這篇

淺拷貝

只複製第一層,巢狀物件還是共用同一個參考。

spreadObject.assign 都是淺拷貝:

js
const original = { name: 'Yuzu', address: { city: 'Taipei' } };
const shallow = { ...original };

shallow.name = 'Mochi';         // ✅ 不影響 original
shallow.address.city = 'Osaka'; // ❌ original.address.city 也變了

console.log(original.name);          // 'Yuzu'
console.log(original.address.city);  // 'Osaka'

name stringby value),所以安全
address objectby reference),所以還是同一個

深拷貝

完整複製所有層兩個物件完全獨立

現代瀏覽器原生支援 structuredClone

const original = { name: 'Yuzu', address: { city: 'Taipei' } };
const deep = structuredClone(original);

deep.address.city = 'Osaka';

console.log(original.address.city); // 'Taipei' ✅

老專案常見但有限制不支援 functionDate):

const deep = JSON.parse(JSON.stringify(original));