一、深拷贝与浅拷贝的区别
1、浅拷贝
浅拷贝只复制某个对象的引用(内存地址),而不复制对象本身,新旧对象还是共享同一块内存
2、深拷贝
深拷贝会创造一个一摸一样的对象,新对象和原对象不共享内存,修改新对象不会改变原对对象。
二、浅拷贝方法
Object.assign()
Object.assign()方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。Object.assign()拷贝的是对象的属性的引用,而不是对象本身。
三、深拷贝方法
1.ES6中的扩展运算符(单层数据为深拷贝,多层为浅拷贝)
2.slice方法(单层数据为深拷贝,多层为浅拷贝)
3.concat方法(单层数据为深拷贝,多层为浅拷贝)
4.JSON.parse(JSON.stringify(obj))(无法拷贝函数内部函数)
5.手写深拷贝
let obj = {
aaa:'123',
bbb:[{a:1,b:2},{c:3,d:4}],
ccc:{e:4,f:5},
ddd:null,
eee:undefined,
ggg: function(){}
}
function deepClone(oldobj){
let newobj
if(typeof(oldobj) === 'function') return oldobj
if(oldobj instanceof Array){
newobj = []
oldobj.forEach(item =>{
newobj.push(deepClone(item))
})
}else if(oldobj instanceof Object){
newobj = {}
for (let i in oldobj) {
// hasOwnProperty()函数用于指示一个对象自身(不包括原型链)是否具有指定名称的属性。如果有,返回true,否则返回false。
// for in循环对象会访问原型链上所有对象属性。它能帮你指向你当前循环的对象,而过滤掉原型链上其它对象
if (oldobj.hasOwnProperty(i)) {
newobj[i] = deepClone(oldobj[i])
}
}
}else{
newobj = oldobj
}
return newobj
}
let newobj = deepClone(obj)
newobj.bbb[0].b = 888
newobj.ccc.e = 666
console.log(obj);
console.log(newobj);
运行结果
手写深拷贝函数--解决循环引用问题可参考blog.csdn.net/weixin_4574…
参考文章: