浅拷贝vs深拷贝

浅拷贝和深拷贝是针对对象而言的复制
堆栈中:浅拷贝指的是复制栈里面的地址或堆里面的第一层值,如果对象不止一层的话浅拷贝就不适用了,深拷贝是把堆里面的内容完全复制到一个新对象里面,完全脱离母体

浅拷贝

图片.png
//获取对象自身可枚举属性(可枚举属性就是对象里面存在的key),下面的keys是数组obj里面所有key的一个数组
let keys=Object.key(obj)

深拷贝

把oldobj堆里面的内容复制一份新的,赋值个另一个空对象newobj
由于一个对象可以嵌套各种基本类型和引用类型
所以怎么办呢?


图片.png
什么是死循环?
图片.png
image.png

出现死循环,使用分类(基本类和引用类)和递归(自己循环自己内部值),由于死循环没有尽头,所以使用递归循环会爆炸
什么是分情况讨论?
基本数据类型直接拷贝,如果是对象需要递归

下面是一个简单的深拷贝:

图片.png

使用jQuery的深拷贝extend

image.png

注意extend用于两个对象合并时写不写true的区别
有true 深覆盖
无true 浅覆盖

image.png
image.png

JSON解决深拷贝

如果利用for in循环分情况讨论,会很复杂,死循环又会爆炸
怎么办呢?

把对象是JSON数据(JSON的方法来处理)

对象1=>字符串=>对象2
得到对象1和对象2是堆中两个不同空间的对象

JSON特点:


图片.png

代码:

        <script>
        var oldobj={
            name:"pearl",
            age:24,
            firend:{
                name:"liu",
                age:24
            }
        }
        function deepCopy(obj){
            var obj2;
            obj2=JSON.stringify(obj);
            obj2=JSON.parse(obj2);
            return obj2;
        }
        var newobj=deepCopy(oldobj);//得到新对象newobj
        newobj.age=40;//改变新对象中age的值,测试会不会牵连到oldobj
        console.log(newobj);//输出新对象
        console.log(oldobj);//输出oldobj对象
    </script>

输出结果:

图片.png

知乎 解决深浅拷贝的详细解答

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 值类型与引用类型 谈浅拷贝与深拷贝之前,我们需要先理清一个概念,即值类型与引用类型。 什么是值类型与引用类型?这要...
    franose阅读 624评论 1 8
  • 在 JS 中有一些基本类型像是Number、String、Boolean,而对象就是像这样的东西{ name: '...
    tobAlier阅读 577评论 0 0
  • 本文思维导图如下: 本文首发于我的个人网站: http://cherryblog.site/本文作者: Cherr...
    sunshine小小倩阅读 1,027评论 2 14
  • 最近的学习中,仔细研究了下深拷贝和浅拷贝,下面就来简单的总结下。 数据类型 首先我们了解下两种数据类型:1、基本类...
    iyimao阅读 745评论 0 0
  • 拷贝即复制。本文只讨论js中复杂数据类型的复制问题(Object,Array等),不讨论基本数据类型(null,u...
    _Dot912阅读 914评论 0 6