如何使用structuredClone進行JavaScript物件的深拷貝

以現代方式進行JavaScript變數的深拷貝 多年以來,我們一直使用奇怪的解決方法來進行JavaScript物件的深拷貝。 其中許多方法容易出現錯誤。 比如使用JSON.parse(JSON.stringify(obj)),這種方法可能會忽略某些類型的物件。 或者更糟糕的是,通過引用來複製物件屬性,這樣可能會引入未來的錯誤。 如今,我們有structuredClone(),它是DOM API的一部分。 它不是JavaScript的一部分,而是DOM API的一部分。 它在所有現代瀏覽器的最新版本中都可用: 在Node.js 17+中也可用。

如何深度複製 JavaScript 物件

在 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....