深拷贝使用 JSON.parse(JSON.stringify(obj)) 处理日期对象、undefined、null、function 等数据会出错。
普遍的办法是手写递归深拷贝
lodash有深拷贝函数,npm也有clone-deep包可以用
let obj = {
numberParams: 1,
functionParams: () => {
console.log("昨天基金全是绿的,只有我的眼睛是红的");
},
objParams: {
a: 1,
b: 2,
},
};
let deepClone = (obj = {}) => {
let newObj = Array.isArray(obj) ? [] : {};
// 递归条件
if (typeof obj === "object" && typeof obj !== null) {
// 如果目标是引用类型,遍历复制目标的所有属性
for (let key in obj) {
newObj[key] = deepClone(obj[key]); // 递归核心
}
} else newObj = obj; // 如果目标不是引用类型,则直接赋值
return newObj; // 递归出口
};
let obj2 = deepClone(obj);
obj2.objParams.a = 123123123123;
console.log(obj);
console.log(obj2);