定义深拷贝:复制对象与原对象互不影响浅拷贝:复制对象与原对象第一层互不影响普通深拷贝JSON.parse(JSON.stringify())手动封装deepCopyCommonshallowcopyObject.assign()es6扩展操作符shallowCopy的原理首先我们要明白深拷贝和浅拷贝都是针对引用数据类型的。基本数据类型没有深浅拷贝的概念。为什么?我们先来了解一下两种存储空间--stack和stack:自动分配,存储空间小,一般用于存储一定大小空间的数据,自动释放内存堆:存储空间大,存储空间不确定的数据大小,需要手动释放内存上面我们简单介绍了栈的特点。js的基本数据类型一般决定了存储空间的大小,也就是说每种基本数据类型在栈中都是独立存在的,互不影响,所以没有深度。复制,但引用数据类型不存储在堆中。通过调用堆栈中的引用地址访问堆引用数据。多个引用地址指向堆中的同一块内存。我们在修改数据的时候,实际上是通过引用地址修改了堆内存中的内存数据,所以牵一发而动全身。有时候这种现象是我不想看到的,所以就有了深拷贝和浅拷贝,所以原理很简单。为我们需要切断连接的数据重新开辟一块内存空间这样我们深拷贝:所有属性都会开辟一个新的内存空间切断与原对象的连接浅拷贝:只开辟一个新的内存空间对于一级属性,如果原始对象嵌套在其他嵌套层中,仍然复制引用地址示例://深度复制正负序列JSON.parse(JSON.stringify())varobj={name:'zs',信息:{年龄:18,性别:'男'}}varobj1=JSON.parse(JSON.stringify(obj))obj1.name='ls'obj1.info.age=22console.log(obj.name,obj.info.age,obj1.name,obj1.info.age)//zs18ls22//浅拷贝扩展运算符varobj={name:'zs',info:{age:18,sex:'male'}}varobj1={...obj}obj1.name='ls'obj1.info.age=22console.log(obj.name,obj.info.age,obj1.name,obj1.info.age)//zs22ls22//浅拷贝Object.assignvarobj={name:'zs',info:{age:18,sex:'male'}}varobj1=Object.assign({},obj)obj1.name='ls'obj1.info.age=22console.log(obj.name,obj.info.age,obj1.name,obj1.info.age)//zs22ls22注意:Object.assign的第一个参数不是空对象或空数组它只是复制内存地址
