實(shí)現(xiàn)深拷貝可以避免對象之間的引用關(guān)系,當(dāng)原始對象的屬性值發(fā)生變化時(shí),深拷貝后的對象不受影響。
以下是通過 JavaScript 實(shí)現(xiàn)深拷貝的幾種方式:
手動實(shí)現(xiàn)深拷貝
function deepClone(obj) {
if (typeof obj !== 'object' || obj === null) {
return obj;
}
let result;
if (Array.isArray(obj)) {
result = [];
for (let i = 0; i < obj.length; i++) {
result.push(deepClone(obj[i]));
}
} else {
result = {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
result[key] = deepClone(obj[key]);
}
}
}
return result;
}
使用 JSON 序列化和反序列化實(shí)現(xiàn)深拷貝
const newObj = JSON.parse(JSON.stringify(oldObj));
需要注意的是,這種方式不支持復(fù)制函數(shù)、正則等特殊對象。
使用第三方庫如 Lodash 實(shí)現(xiàn)深拷貝
const newObj = _.cloneDeep(oldObj);
以上幾種方式可以根據(jù)實(shí)際情況進(jìn)行選擇,手動實(shí)現(xiàn)深拷貝較為靈活,而使用 JSON 序列化和反序列化效率較高,使用第三方庫則更為便捷。