JS对象深浅拷贝

时间:20-11-12 栏目:Javascript 作者:zongyan86 评论:0 点击: 2,435 次

浅拷贝
1、简单实现

for(let prop in obj){
  obj2[prop] = obj[prop];
}

2、assign

Object.assign(obj2,obj);

3、拓展运算符

obj2 = {obj};

4、

let tmp = JSON.stringify(obj);
obj2 = JSON.parse(tmp);

深拷贝

1、

function  deepClone(origin){
            let target = origin.constructor === Array? []:{};//判断复制源为什么类型
            for(let prop in origin){
                if(origin.hasOwnProperty(prop)){//是否为原型链上的属性
                    if(typeof origin[prop] == "object"){//判断是否为基本数据类型
                        origin[prop].constructor === Array ?  target[prop] = []:target[prop] = {};
                        target[prop] = deepClone(origin[prop]);//为引用数据类型 深层拷贝 递归调用自身   
                    }else{
                        target[prop] = origin[prop];//正常复制
                    }
                }
            }
            return target;
}
 obj2 = deepClone(obj);

2、

function  deepClone(origin){
            let toStr = Object.prototype.toString;//保存函数引用
            let arrayStr = "[object Array]"; //储存调用函数判断为数组时返回的值
            let target = toStr.call(origin) ==  arrayStr? []:{};//判断复制源为什么类型
            for(let prop in origin){
                if(origin.hasOwnProperty(prop)){//是否为原型链上的属性
                    if(typeof origin[prop] == "object"){//判断是否为基本数据类型
                        toStr.call(origin[prop]) ==  arrayStr ?  target[prop] = []:target[prop] = {};
                        target[prop] = deepClone(origin[prop]);//为引用数据类型 深层拷贝 递归调用自身   
                    }else{
                        target[prop] = origin[prop];//正常复制
                    }
                }
            }
            return target;
        }
obj2 = deepClone(obj);

3、jq $.extend(true,{},{})



声明: 本文由( zongyan86 )原创编译,转载请保留链接: JS对象深浅拷贝

关注我们