FE Interview Hub
JavaScript 中階

JavaScript 中的淺拷貝 (shallow copy) 和深拷貝 (deep copy) 差別是什麼?要如何實踐?

AI 練習作答

核心差別

淺拷貝 深拷貝
第一層屬性 複製值 複製值
巢狀物件/陣列 共用參考 遞迴複製新物件
修改巢狀內容 會影響原物件 不會影響原物件

淺拷貝(Shallow Copy)

方法一:Object.assign()

const original = { a: 1, b: { c: 2 } };
const copy = Object.assign({}, original);

copy.b.c = 99;
console.log(original.b.c); // 99(原物件被影響!)

方法二:Spread 運算子

const copy = { ...original };
const arrCopy = [...originalArr];

方法三:Array.prototype.slice()

const copy = originalArr.slice();

深拷貝(Deep Copy)

方法一:JSON.parse(JSON.stringify())(最簡單,但有限制)

const original = { a: 1, b: { c: [1, 2, 3] } };
const deep = JSON.parse(JSON.stringify(original));

deep.b.c.push(4);
console.log(original.b.c); // [1, 2, 3](不受影響)

限制:

  • 無法處理 undefinedfunctionSymbol
  • 無法處理循環引用(會報錯)
  • 無法處理 DateMapSet 等特殊物件

方法二:structuredClone()(ES2022,推薦)

const deep = structuredClone(original);

支援更多資料型別,可處理循環引用。

方法三:遞迴手動實現

function deepClone(obj) {
  if (obj === null || typeof obj !== 'object') return obj;
  if (Array.isArray(obj)) return obj.map(deepClone);
  
  return Object.fromEntries(
    Object.entries(obj).map(([k, v]) => [k, deepClone(v)])
  );
}

方法四:第三方函式庫

import cloneDeep from 'lodash/cloneDeep';
const deep = cloneDeep(original);

✦ AI 模擬面試

輸入你的答案,AI 即時分析精準度與改進空間

登入後即可使用 AI 評分