实现深浅拷贝的方式有哪些

185 阅读2分钟
1.首先得理解什么是深浅拷贝  


浅拷贝:创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。

 深拷贝:将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象

 2.如何实现深拷贝 

 方式一:JSON.parse(JSON.stringify());

 但是它还是有很大缺陷的,比如拷贝其他引用类型、拷贝函数、循环引用等情况。


 方拾二: 手动实现 创建一个新的对象,遍历需要克隆的对象,将需要克隆对象的属性依次添加到新对象上,返回。

 function clone(target) {      

     let cloneTarget = {};     

     for (const key in target) { 

              cloneTarget[key] = target[key];       

       }    

    return cloneTarget;

 }


 遇到更深层次的对象,可能需要递归的情况

 function clone(target) {

          if (typeof target === 'object') {

                   let cloneTarget = {};

                   for (const key in target) {

                          cloneTarget[key] = clone(target[key]);

                     } 

                  return cloneTarget;

             } 

           else {

                 return target;

                  }

     };


 遇到含有数组的情况

 module.exports = function clone(target) {

               if (typeof target === 'object') { 

                    let cloneTarget = Array.isArray(target) ? [] : {};

                    for (const key in target) {

                            cloneTarget[key] = clone(target[key]);

                      }

                   return cloneTarget; 

       } 

        else {

              return target; 

             } 

  };