js对象的深拷贝和浅拷贝

文章目录

浅拷贝

浅拷贝引用值是要相互影响的,因为它是栈内存之间的赋值,赋值的是地址,一个更改,其他的都要更改。

 var obj = {
        name :'abc',
        age  : 123,
        sex : 'female',
        card : ['visa','master']//存在一个引用值
    }
    var obj1 = {}
    function clone(origin,target) {
        var target = target || {};//防止没有提前新建一个空对象
        for(var prop in origin){
            target[prop] = origin[prop];
        }
    }
    clone(obj,obj1);

在这里插入图片描述

深拷贝

深拷贝就是无论是原始值还是引用值,修改后彼此相互不影响。

遍历对象   for(var prop in obj)(for in也可以遍历数组(数组也是特殊类型的对象))
1,判断是不是原始值  typeof() object--->引用值
2,判断是数组还是对象 constructor,instanceof,toString
3,建立相应的数组或者对象
4,递归
var obj = {
    name : "abc",
    age : 123,
    card : ['visa','master'],
    wife : {
        name : "bcd",
        son : {
            name : "aaa"
        }
    }
}

var obj1 = {
    // name : obj.name,
    // age : obj.age,
    // card : [obj.card[0],obj.card[1]],
    // wife : {
    //     name : "bcd",
    //     son : {

    //     }
    // }
}

function deepClone(origin, target){
    var target = target || {},
         toStr = Object.prototype.toString,
        arrStr = "[Object Array]";

        for(var prop in origin){  
            if(origin.hasOwnProperty(prop)){
                if(origin[prop] !== "null" && typeof(origin[prop]) == 'object'){

                //    if(toStr.call(origin[prop]) == arrStr){
                //        target[prop] = [];
                //    }else{
                //     target[prop] = {};
                //    }   
                //上面的ifelse条件判断可以用下面的三目运算符代替: 
                target[prop] = toStr.call(origin[prop]) == arrStr ? [] : {};
                deepClone(origin[prop],target[prop]);  
                
                }else{
                    target[prop] = origin[prop];
                }
            }
        }
        return target;
}
deepClone(obj,obj1);

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43623871/article/details/88797285