深拷贝的实现方式

Posted coderkey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深拷贝的实现方式相关的知识,希望对你有一定的参考价值。

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

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方法,只能拷贝第一层属性,他们都不是真正的深拷贝;


以上是关于深拷贝的实现方式的主要内容,如果未能解决你的问题,请参考以下文章

浅拷贝与深拷贝的实现方式区别;deepcopy如果你来设计,如何实现

记录-实现深拷贝的四种方式

JS 中深拷贝的几种实现方法

js实现深拷贝

实现深拷贝最少得用几行代码?

深拷贝的实现方式