深拷贝与浅拷贝**在日常的开发过程中,我们经常会涉及到数据拷贝。有时会混淆是使用深拷贝还是浅拷贝。我们先搞清楚什么是深拷贝,什么是浅拷贝。**关于深拷贝和浅拷贝的定义:如果浅拷贝的属性都是基本数据类型,那么就是拷贝基本数据类型的值。如果属性中有引用数据类型,则复制内存地址。这时候修改新的对象会导致原来的对象被修改。深拷贝如果属性都是基本数据类型,那么就是一个副本如果基本数据类型的值在属性中有引用数据类型(对象),就会创建一个新的对象,属性和值原对象的复制,放在新对象中,新对象的修改不会影响原对象浅拷贝实现ES6扩展运算符/*使用ES6扩展运算符*/constarr=[1,2,3,4]constobj={name:"张三",age:12}constnewArr=[...arr]constnewObj={...obj}console.log(newArr)//[1,2,3,4]console.log(newObj)//{name:'张三',age:12}Object.assign(targetobject,copysource)/*Object.assign(target,sources)第一个参数:targetobject(被复制的对象)第二个参数:copysource(被复制的原始对象)*/constobj={name:'张三',age:10}constarr=[1,2,3]constnewObj=Object.assign({},obj)constnewArr=Object.assign([],arr)控制台。log(newObj)//{name:'张三',age:10}console.log(newArr)//[1,2,3]使用浅拷贝复制对象数据时产生/*ifthere的影响是对象中的引用数据类型(即在对象中surfacecontainstheobject),使用浅拷贝,那么修改复制的对象会导致原对象被修改*/constobj={name:'张三',age:10,info:{address:'Hubei',postcode:'430000',},}constnewObj={...obj}//如果对象中引用数据类型的数据被修改,原对象也会被修改newObj.info.postcode='410000'console.log(newObj.info)//{address:'Hubei',postcode:'410000'console.log(obj.info)//{address:'Hubei',postcode:'410000'}深拷贝实现JSON.parse(JSON.stringify(sources))/*如果对象中存在引用数据类型(即对象包含对象),使用深拷贝,那么修改拷贝的对象不会导致修改原对象*/constobj={姓名:'张三',年龄:10,信息:{地址:'湖北',邮编:'430000',},}constnewObj=JSON.parse(JSON.stringify(obj))newObj.info.postcode='410000'console.log(newObj.info)//{address:'湖北',postcode:'410000'}console.log(obj.info)//{address:'Hubei',postcode:'430000'}使用递归复制//object:待复制对象的hash默认创建一个空mapfunctiondeepCopy(object,hash=newMap())=>{//判断是否为引用数据类型,如果不是直接返回if(typeofobject!='object')returnobject//判断key在hash中是否存在,存在则返回if(hash.get(object)){returnobject}//这里只能执行数组和对象//object.constructor指向构造器本身,通过构造器创建对象或数组letcontainer=newobject.constructor()//将这个key存入map,后面循环时如果key存在,则停止循环hash.set(object,container)for(letkeyinobject){//如果对象是对象,那么这里的key代表对象的key//如果对象是数组,那么key代表数组元素的下标//然后在这里递归调用,直到object数据类型没有引用,则递归结束container[key]=deepCopy(object[key],hash)}//最后返回这个对象或者数组返回容器}constobj={name:'张三',info:{age:10,},}constnewObj=deepCopy(obj)newObj.info.age=20console.log(newObj.info)//{address:'Hubei',postcode:'410000'console.log(obj.info)//{address:'Hubei',postcode:'410000'}本文内容主要包括:浅拷贝和深拷贝的区别浅拷贝es6扩展的两种实现方式operatorObject.assign()实现深拷贝的两种方式1:JSON.parse(JSON.stringify)实现深拷贝2:使用递归函数进行深拷贝
