浅拷贝与深拷贝

164 阅读1分钟

一、深拷贝与浅拷贝的区别

1、浅拷贝

浅拷贝只复制某个对象的引用(内存地址),而不复制对象本身,新旧对象还是共享同一块内存

2、深拷贝

深拷贝会创造一个一摸一样的对象,新对象和原对象不共享内存,修改新对象不会改变原对对象。

二、浅拷贝方法

Object.assign()

Object.assign()方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。Object.assign()拷贝的是对象的属性的引用,而不是对象本身。

image.png

三、深拷贝方法

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);

运行结果

image.png

手写深拷贝函数--解决循环引用问题可参考blog.csdn.net/weixin_4574…

参考文章:

1.blog.csdn.net/weixin_4581…

2.www.cnblogs.com/echolun/p/7…

3.zhuanlan.zhihu.com/p/267810696