区别:
1、浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。
2、深拷贝会创造一个一模一样的对象,新对象和原对象不共享内存,修改新对象不会改变原对象。
注意:
解构赋值,如果所解构的原对象是一维数组或对象,其本质就是对基本数据类型进行等号赋值,那它就是深拷贝;如果是多维数组或对象,其本质就是对引用类型数据进行等号赋值,那它就是浅拷贝。
实现方式:
浅拷贝:
1、基于Object.assign
2、基于for in
3、...原地展开
深拷贝:
1、借用JSON对象的parse和stringify
2、使用递归的方式
3、Object.assign()拷贝,当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝。
4、lodash函数库 提供了lodash.cloneDeep()
拓展:
基本类型:Number、String 、Boolean、Null和Undefined。基本数据类型是按值访问的,因为可以直接操作保存在变量中的实际值
引用类型:Object、Array 、Function 、Data等。引用数据类型是保存在堆内存中的对象,只能操作对象在栈内存中的引用地址