深拷貝(Deep clone)快速參考
將一個物件或陣列完整複製(含巢狀結構),以免修改原始資料。
推薦做法
- 優先:
structuredClone(value)(現代瀏覽器與支援的 Node.js)。 - fallback:若只含 JSON 資料可用
JSON.parse(JSON.stringify(obj))。 - 需處理各種型別與 edge case 時,使用成熟函式庫(例如
_.cloneDeep)。
// 簡短範例(瀏覽器 / Node.js 支援)
const src = { n: 1, d: new Date(), m: new Map([[1, 'a']]) }
const copy = structuredClone(src)注意事項與支援(簡要)
structuredClone支援多數結構化可複製型別並能處理循環參考;但遇到函式、閉包、Symbol、DOM 節點等無法序列化的值時,會拋出DataCloneError(DOMException)使整個複製失敗,而非像 JSON 方法那樣靜默略過該屬性。不確定輸入內容時請用 try/catch 容錯。- JSON 方法(
JSON.parse(JSON.stringify(...)))只適用於 JSON 資料,會丟失 Date、RegExp、Map/Set、undefined、Symbol、函式等,且無法處理循環參考。 _.cloneDeep功能最全面,但需額外依賴並會增加封包大小。- 支援情況:
structuredClone已在現代桌面與行動瀏覽器支援;Node.js 17+ 也包含原生支援。