首先数据类型有两种,一种基本数据类型(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
手写递归 遍历对象、数组直到里边都是基本数据类型,然后再去复制,就是深度拷贝
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。