我操作清空Data2的coilCode,Data1的数据也会变,它们是不是指向了同一内存地址,怎么解决,深拷贝吗,请问怎么用
function(list) {
this.Data1 = list
this.Data2 = list
this.Data2.forEach(i => {
i.name = ''
})
我操作清空Data2的coilCode,Data1的数据也会变,它们是不是指向了同一内存地址,怎么解决,深拷贝吗,请问怎么用
function(list) {
this.Data1 = list
this.Data2 = list
this.Data2.forEach(i => {
i.name = ''
})
深拷贝不是件容易的事,会遇到循环引用之类的难题。
有一个奇技淫巧是使用JSON.parse(JSON.stringify(obj))
进行深拷贝,但是遇到一些特殊类型会失效,例如:
也可以使用现有开源库,例如:
用转换成json再转换回对象的方式,封装成函数以后可以直接用。
copyDeep(templateData) {
// templateData 是要复制的数组或对象,这样的数组或者对象就是指向新的地址的
return JSON.parse(JSON.stringify(templateData));
}
用JSON.parse(JSON.stringify(obj))貌似性能差点,下面这个方法也可以深克隆
export function clone(obj, obj2) {
obj2 = obj2 || {};
for (let name in obj) {
if (obj[name] instanceof Object) {
//先判断一下obj[name]是不是一个对象
obj2[name] = obj[name] instanceof Array ? [] : {}; //我们让要复制的对象的name项=数组或者是json
clone(obj[name], obj2[name]); //然后来无限调用函数自己 递归思想
} else {
obj2[name] = obj[name]; //如果不是对象,直接等于即可,不会发生引用。
}
}
return obj2; //然后在把复制好的对象给return出去
}
10 回答11.7k 阅读
2 回答3.2k 阅读✓ 已解决
4 回答4.6k 阅读✓ 已解决
3 回答2.7k 阅读✓ 已解决
4 回答2.1k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
可以用扩展语法...拷贝一份出来