复制对象——深拷贝和浅拷贝

44 阅读1分钟

深拷贝:可以简单理解为修改拷贝出来的的对象不影响原对象

  1. JSON.parse()JSON.stringify()
const obj = {a:1,b:2,c:{c1:3}};
const newObj = JSON.parse(JSON.stringify(obj));
newObj.a=100
newObj.d=100
newObj.c.c1=100
newObj.c.d1=100
console.log(newObj, obj);``
  1. 递归函数
function deepCopy(obj) {
    //判断对象的类型
    var newObj = Array.isArray(obj) ? [] : {};
    if (obj && typeof obj == "object") { //迭代
        for (var key in obj) {
            if (typeof obj[key] == 'object') {
                newObj[key] = deepCopy(obj[key])
            } else {
                newObj[key] = obj[key]
            }
        }
    }
    return newObj
}

浅拷贝:仅仅拷贝了对象的引用。修改拷贝出来的的对象仍然会影响原对象

  1. Object.assign() 注意这个方法只能将第一层对象进行深拷贝,一旦对象中的值还存在引用数据类型就不是深拷贝了。因此不能属于深拷贝。
const obj = {a:1,b:2,c:{c1:3}};
const newObj = Object.assign({},obj)
newObj.a=100
newObj.d=100
newObj.c.c1=100
newObj.c.d1=100
console.log(newObj, obj);

查看下来newObj为{a:100,b:2,c:{c1:100,d1:100},d:100}; obj为{a:1,b:2,c:{c1:100,d1:100}}

  1. 结构赋值。同上
const obj = {a:1,b:2,c:{c1:3}};
const newObj = {...obj}
newObj.a=100
newObj.d=100
newObj.c.c1=100
newObj.c.d1=100
console.log(newObj, obj);