常用的深拷贝和浅拷贝方法

浅拷贝:只能拷贝一层 & 对于基本类型是值拷贝,对于引用类型是引用拷贝
深拷贝:可以拷贝多层 & 对于引用类型可以赋值值

浅拷贝方法:
1、

    for(var attr in a ){
        b[attr] = a[attr]         
    }
}

2、只用于对象
Object.assign()
也可以用于对象的合并,对于相同属性,会将原值覆盖

深拷贝方法:
1、通用,递归方法

function deepCopy(a,b){ //a:source b:target
    for(var attr in a){
        var item = a[attr]; //取出被拷贝对象的属性数据,进行判断是否是引用数据进行拷贝
        if(item instanceof Array){
            b[attr] = [];//这个空数组 就是我们暂存数据的地方,开辟新堆存数据,实现深拷贝
            deepCopy(item,b[attr]);
        }else if(item instanceof Obejct){
            b[attr] = {};
            deepCopy(item,b[attr])
        }else{
            b[attr] = item;
        }
    }
}

2、json.parse(json.stringify(obj))
缺点:对于以下情况会失效
(1)如果obj里面有时间对象,则JSON.stringify后再JSON.parse的结果,时间将只是字符串的形式。而不是时间对象
(2)如果obj里有RegExp、Error对象,则序列化的结果将只得到空对象
(3)如果obj里有函数,undefined,则序列化的结果会把函数或 undefined丢失
(4)如果obj里有NaN、Infinity和-Infinity,则序列化的结果会变成null
(5)如果obj中的对象是有构造函数生成的, 则使用JSON.parse(JSON.stringify(obj))深拷贝后,会丢弃对象的constructor;
(6)如果对象中存在循环引用的情况也无法正确实现深拷贝;

参考:
1、深拷贝、浅拷贝方法:https://zhuanlan.zhihu.com/p/490911572
2、json.parse(json.stringify)缺点:https://blog.csdn.net/Amnesiac666/article/details/122412248

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

推荐阅读更多精彩内容