美文网首页
js深拷贝、浅拷贝

js深拷贝、浅拷贝

作者: 喵喵同学嘛 | 来源:发表于2019-04-18 17:27 被阅读0次

    1. 基本介绍

    在js中有两种数据类型,基本数据类型和引用数据类型,我们知道对其赋值操作的时候,对于基本数据类型,会直接把其值赋值给另外一个对象,但是对于引用数据类型,赋值的只是栈中的地址,其实指向的还是堆中的同一个对象,并不会创建新的对象。
    那么如何进行拷贝呢

    2. 浅拷贝

    1、for in 循环
    2、直接赋值
    3、Object.assign(其实他的第一层是深拷贝,后面的是浅拷贝)

    3. 深拷贝

    1. JSON.parse(JSON.stringfy(obj))

    这个会存在一些问题:

    1. 他无法实现对函数 、RegExp等特殊对象的克隆
    2. 会抛弃对象的constructor,所有的构造函数会指向Object
    3. 对象有循环引用,会报错

    2. 自己手写一个

    function DeepCopy(obj){
        if(typeof obj!=='object'&& typeof obj !=='function') //基本类型
        return obj
        let newobj=Array.isArray(obj)?[]:{} 
        for(key in obj){
            if(obj.hasOwnProperty(key)){ //是否是自己的属性,而不是原型对象上的属性
                newobj[key]=typeof obj[key]==='object'?DeepCopy(obj[key]):obj[key]
            }
        }
        return newobj
    }
    

    其实这个也是存在问题的,

    1. 对于正则表达式并不能复制
    2. 会抛弃对象的constructor,所有的构造函数会指向Object,如下图所示
    image.png

    要想真正的实现一个深拷贝,要进行对不同类型的判断作特殊处理

    在实际项目中,还是要看具体情况来选择,如果属性的类型丰富,不确定,特别严格的话还是建议使用lodash库去实现

    相关文章

      网友评论

          本文标题:js深拷贝、浅拷贝

          本文链接:https://www.haomeiwen.com/subject/coutgqtx.html