浅拷贝与深拷贝

浅拷贝与深拷贝的理解

      对象拷贝(Object Copy)就是将一个对象的属性拷贝到另一个有着相同类类型的对象中去。在程序中拷贝对象是很常见的,主要是为了在新的上下文环境中复用对象的部分或全部 数据。JavaScript中有两种类型的对象拷贝:浅拷贝(Shallow Copy)、深拷贝(Deep Copy)。

基本类型与引用类型

(1)基本类型–名值存储在栈内存中,例如let a=1;


1.0

执行b = a 时,栈内存会新开辟一个内存,此时修改b的值也不会改变a


1.2

(2)引用数据类型–名存在栈内存中,值存在于堆内存中;

      栈内存提供的是一个引用的地址指向堆内存中的值。

浅拷贝与深拷贝的区别

浅拷贝 : 只是拷贝了基本类型的数据,而引用类型数据,复制后也是会发生引用,我们把这种拷贝叫做“浅拷贝”,换句话说,浅复制仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变。

深拷贝 : 在计算机中开辟了一块新的内存地址用于存放复制的对象。

 深拷贝,是拷贝对象各个层级的属性。

区别:浅拷贝只复制对象的第一层属性、深拷贝可以对对象的属性进行递归复制。

浅拷贝是拷贝一层,深层次的对象级别的就拷贝引用;深拷贝是拷贝多层,每一级别的数据都会拷贝出来。


浅拷贝的第一个方法


function simpleClone(obj) {

            var newObj = {};

            for ( var i in obj) {

                newObj[i] = obj[i];

             }

         return newobj;

}



浅拷贝的第二个方法

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

Object.assign(target, ...sources)

参数:

target:目标对象。

sources:任意多个源对象。

返回值:目标对象会被返回



深拷贝的代码实现

 fucntion cloneArr(src, target){

          for(let item of src){

                  if(Array.isArray(item)){

                       target.push(cloneArr(item, []));

                   }else if(typeof  item === 'object'){

                       target.push(deepClone(item, {}));

                  }else{

                        target.push(item);

       }

   }

    return target;

}

       function deepClone(src, target){

                   const keys = Reflect.ownKeys(src);

                   let values = null;

                   for(let key of keys){

                       value = src[key];

                     if(Array.isArray(value)){

                            target.push(cloneArr(value, []));

                     }else if(typeof value === 'object'){

                           target.push(deepClone(value, {}));

                    }else{

                           target.push(value);

                     }

         }

          return target;

}

引用的原文地址:深拷贝与浅拷贝

你可能感兴趣的:(浅拷贝与深拷贝)