开发者社区> 问答> 正文

浅拷贝与深拷贝的区别

浅拷贝与深拷贝的区别

展开
收起
问答小能手! 2021-01-15 21:04:11 1573 0
1 条回答
写回答
取消 提交回答
  • 来自昆仑山,真名陆离。

    首先数据类型有两种,一种基本数据类型(String, Number, Boolean, Null, Undefined,Symbol)和引用数据类型(Array,Object)。
    基本数据类型是直接存储在栈内存中的。引用数据类型则是在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。
    深拷贝和浅拷贝的区别就是:浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
    浅拷贝与赋值的区别:赋值得到的对象与原对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。而浅拷贝会创建一个新对象,如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址。 改变赋值对象的任意属性都会改变原对象,但改变浅拷贝对象基本类型的属性不会改变原对象基本属性的值,改变引用类型的属性才会改变原对象对应的值。

    image.png

    浅拷贝的实现

    Object.assign
    Array.prototype.slice()
    Array.prototype.concat()
    解构赋值 let { ...x } = obj;

    深拷贝的实现

    JSON.parse(JSON.stringify())
    lodash.cloneDeep
    手写递归 遍历对象、数组直到里边都是基本数据类型,然后再去复制,就是深度拷贝

    2021-01-15 21:06:26
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载