JavaScript-浅克隆和深克隆

浅拷贝

function clone(origin,target){
        for(var prop in origin){
            if(origin.hasOwnProperty(prop)){
                target[prop] = origin[prop];
            }
        }
        return target;
    }

上述代码实现了浅拷贝,浅拷贝就是当遇到引用数据类型的时候,只拷贝它的引用值,而不深层拷贝它本身的值,所以用浅拷贝来拷贝对象的时候,会出现如下状况:

var person1 = {};
clone(person,person1);
person1.likeColors.push("black");
console.log("person color:" + person.likeColors);
console.log("person1 color:" + person1.likeColors);

结果会是:

浅拷贝拷贝来的对象并不是完全独立的对象,当拷贝来的对象或被拷贝的对象修改它们的引用数据类型值的时候,它们都会同步发生变化,因为它们引用所指向的堆内存地址是相同的。

深拷贝

用递归的方式实现

    function deepClone(target){
        var result;
        var str = "[object Object]";
        if(typeof target === 'object'){
            if(Array.isArray(target)){
                result = [];
                for(let i in target){
                    result.push(deepClone(target[i]));
                }
            }else if(target === null || target === undefined){
                result = target===null?null:undefined;
            }else if(target.constructor === RegExp){
                result = target;
            }else if(target instanceof Object){
                result = {};
                for(let i in target){
                    result[i] = deepClone(target[i]);
                }
            }else if(target instanceof date){
                result = target;
            }
        }else{
            result = target;
        }
    return result;
    }

运行效果:

posted @ 2019-11-06 16:56  好多坨屎  阅读(570)  评论(0)    收藏  举报