深拷贝的实现方式

一,用递归去复制所有层级属性

function deepClone(obj) {
    let objClone = Array.isArray(obj) ? [] : {};
    if (obj && typeof obj === "object") {
        for (key in obj) {
            if (obj.hasOwnProperty(key)) {    	 //判断obj的子属性是否为对象,如果是,递归复制
                if (obj[key] && typeof obj[key] === "object") {
                    objClone[key] = deepClone(obj[key]);
                } else {                    //如果不是,简单复制
                    objClone[key] = obj[key];
                }
 				 // objClone[key] = typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key]
            }
        }
    }
    return objClone;
}

// 对象
let oldObj = {
    a: 1, 
    b: {
        c: 2, 
        d: 2
    }
}
 newObj = deepClone(oldObj);
 oldObj['b'].d = 3
 console.log(oldObj, newObj);
 console.log(oldObj === newObj);

// 数组
 let oldArr = [1, 2, 3, [4,4]]
 newArr = deepClone(oldArr);
 oldArr[3][1] = 5
 console.log(oldArr, newArr);
 console.log(oldArr === newArr);

二,用JSON对象的parse和stringify实现

function deepClone(obj){
    let _obj = JSON.stringify(obj),
    objClone = JSON.parse(_obj);
    return objClone
}    

// 对象
let oldObj = {
    a: 1, 
    b: {
        c: 2, 
        d: 2
    }
}
 newObj = deepClone(oldObj);
 oldObj['b'].d = 3
 console.log(oldObj, newObj);
 console.log(oldObj === newObj);

// 数组
 let oldArr = [1, 2, 3, [4,4]]
 newArr = deepClone(oldArr);
 oldArr[3][1] = 5
 console.log(oldArr, newArr);
 console.log(oldArr === newArr);

三,注意

(1)深拷贝,是拷贝对象各个层级的属性;
(2)concatslice方法,只能拷贝第一层属性,他们都不是真正的深拷贝;


猜你喜欢

转载自blog.csdn.net/weixin_46243043/article/details/128222254
今日推荐