对于初学者来说,浅拷贝和深拷贝是个难题,不过当你了解后,发现其实没什么的。
首先数据类型有两种,一种基本数据类型(String, Number, Boolean, Null, Undefined,Symbol)和引用数据类型(Array, Object)。
基本数据类型是直接存储在栈内存中的。引用数据类型则是在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。
深拷贝和浅拷贝的区别就是:浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
浅拷贝与赋值的区别:赋值得到的对象与原对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。而浅拷贝 ** 会创建一个新对象 **,如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址。
改变赋值对象的任意属性都会改变原对象,但改变浅拷贝对象基本类型的属性不会改变原对象基本属性的值,改变引用类型的属性才会改变原对象对应的值。
浅拷贝的实现
Object.assign
Array.prototype.slice()
Array.prototype.concat()
解构赋值let { ...x } = obj;
深拷贝的实现
JSON.parse(JSON.stringify())
lodash.cloneDeep
手写递归 遍历对象、数组直到里边都是基本数据类型,然后再去复制,就是深度拷贝
网友回答文明上网理性发言已有0人参与
发表评论: