js深拷贝和浅拷贝

时间:2022-07-18 19:47:59

  js中对象分为基本类型和复合(引用)类型。基本类型存放在栈内存,复合(引用)类型存放在堆内存。

  栈内存存放一些基本类型的变量和对象的引用变量,堆内存用于存放由new创建的对象。

      浅拷贝仅仅是指向被拷贝的内存地址,如果原地址中对象被改变了,那么浅拷贝出来的对象也会相应改变。

        var obj = {
            a : 1,
            b : 2
        }
        var obj1 = obj;
            obj1.b = 3;
        console.log(obj1); //{a: 1, b: 3}
    console.log(obj1===obj); //true

  深拷贝:我在想如何让obj1复制obj的对象内容,在我对obj1进行修改时,不影响obj。通过递归调用浅拷贝来解决。

        let obj = {
            a : "1",
            b : "2",
            c : function col(){},
            d : [1,2,3],
            e : {
                f : "4"
            }
        }
        function deepCopy(obj){
            if(typeof obj === "object"){
                if(obj.constructor === Array){
                    var newArr = [];
                    for(var i = 0;i<obj.length;i++) newArr.push(obj[i]);
                    return newArr;
                }else{
                    var newObj = {};
                    for(var key in obj){
                        newObj[key] = this.deepCopy(obj[key]);
                    }
                    return newObj;
                }
            }else{
                return obj;
            }
        }

简化:

        function deepCopy(obj){
            let temp = obj.constructor === Array?[]:{};
            for(let val in obj){
                temp[val] = typeof obj[val] == 'object' ? deepCopy(obj[val]) : obj[val];
            }
            return temp;
        }
        console.log(deepCopy(obj));