在 JavaScript 中,有許多方法可以複製物件,但並非所有方法都提供深層複製。本文將介紹最有效的方式,並提供所有可用的選項。
2022年更新:只需使用structuredClone()方法進行複製。詳見如何在 JavaScript 中複製物件
在 JavaScript 中複製物件可能會很棘手。有些方法會執行淺層複製,這是大多數情況下的預設行為。
深層複製 vs 淺層複製 最簡單的選項:使用 Lodash 使用 Object.assign() 使用物件展開運算子 錯誤的解決方案 使用 Object.create() JSON序列化 深層複製 vs 淺層複製 淺層複製能成功複製原始類型,如數字和字串,但是任何物件引用都不會被遞迴複製,而是新複製的物件將引用相同的物件。
如果物件包含其他物件的引用,在對該物件進行淺層複製時,只會複製對外部物件的引用。
而在深層複製中,這些外部物件也會被複製,因此新複製的物件與原始物件完全獨立。
當在網路上搜尋如何在 JavaScript 中深度複製物件時,你會找到很多回答,但這些回答並不總是正確的。
最簡單的選項:使用 Lodash 我建議你依賴於一個經過良好測試、非常受歡迎且精心維護的庫來執行深度複製:Lodash。
Lodash 提供了非常方便的 clone 和 cloneDeep 函數可以執行淺層和深度複製。
Lodash 還具有一個很好的特性:你可以單獨導入單個函數到你的項目中,以大大減少其依賴的大小。
在 Node.js 中:
const clone = require('lodash/clone') const cloneDeep = require('lodash/cloneDeep') 以下是使用這兩個函數的示例:
const clone = require('lodash/clone') const cloneDeep = require('lodash/cloneDeep') const externalObject = { color: 'red', } const original = { a: new Date(), b: NaN, c: new Function(), d: undefined, e: function () {}, f: Number, g: false, h: Infinity, i: externalObject, } const cloned = clone(original) externalObject....