浅析深拷贝和浅拷贝
浅拷贝:有两种方式,一种是把一个对象里面的所有的属性值和方法都复制给另一个对象,另一种是直接把一个对象赋给另一个对象,使得两个都指向同一个对象。
深拷贝:把一个对象的属性和方法一个个找出来,在另一个对象中开辟对应的空间,一个个存储到另一个对象中。
两者就在于,浅拷贝只是简单的复制,对对象里面的对象属性和数组属性只是复制了地址,并没有创建新的相同对象或者数组。而深拷贝是完完全全的复制一份,空间大小占用一样但是位置不同!!
浅拷贝示例:
var obj1 = { age: 10, sex: "男", car: ["奔驰", "宝马", "特斯拉", "奥拓"] }; //另一个对象 var obj2 = {}; //写一个函数,作用:把一个对象的属性复制到另一个对象中,浅拷贝 //把a对象中的所有的属性复制到对象b中 function shallowCopy(obj,targetObj){ for (let key in obj){ targetObj[key] = obj[key]; } } shallowCopy(obj1, obj2); console.dir(obj2);//开始的时候这个对象是空对象 console.dir(obj1);//有属性 //change car attribute obj1.car.push("奥迪"); //the car of obj2 change,too.for the point of the car in obj2 is same as the obj1 console.log(obj2.car); // 第二种 var obj3 = obj1; console.dir(obj3);
深拷贝案例:
var obj1 = { age: 10, sex: "男", car: ["奔驰", "宝马", "特斯拉", "奥拓"], dog: { name: "大黄", age: 5, color: "黑白色" } }; var obj2 = {};//空对象 //通过函数实现,把对象a中的所有的数据深拷贝到对象b中 // use recursion function deepCopy(obj,targetObj){ for (let key in obj){ let item = obj[key]; if (item instanceof Array){//if array targetObj[key] = []; deepCopy(item,targetObj[key]); }else if (item instanceof Object){//if object targetObj[key] = {}; deepCopy(item,targetObj[key]); }else {//normal attribute targetObj[key] = obj[key]; } } } deepCopy(obj1,obj2); console.dir(obj1); console.dir(obj2);
总结:如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。详见https://www.jianshu.com/p/1c142ec2ca45分析
本文转自https://blog.csdn.net/m0_37679293/article/details/87987211,侵删。

浙公网安备 33010602011771号