深拷贝对象

2020-08-06  本文已影响0人  可惜没如果_4d52

常见对象拷贝object.assign、$.extend能复制对象到一个新的对象,对于被拷贝的对象属性值为基础数据类型时没有什么问题,如果被拷贝的对象属性值为array、object则会出现问题

object.assgin,$.extend拷贝对象

var orgObj = {a:{b:'c'}}
var newObj = Object.assign({},orgObj)
var newObj2 = $.extend({},orgObj)
orgObj.a.b='d'

//{a:{b:'d'}} newObj 中a.b的值相应会变是因为复制的属性值为对象和orgObj中a.b指向同一内存地址
//{a:{b:'d'}} newObj2 同理

这种情况只能用做普通的对象拷贝 如果要深拷贝则另想办法

深拷贝

var deepclone = function(obj){
    var cloneObj = Array.isArray(obj) ? [] : {};//注:typeof array == 'object'
    if(obj && typeof obj == 'object'){
        for(let key in obj){
            if(obj.hasOwnProperty(key) && typeof obj[key] == 'object'){
                cloneObj[key] = deepclone(obj[key]);
            }else{
                cloneObj[key] = obj[key];
            }
        }
    }
    return cloneObj;
};
var orgObj = {a:{b:'c'}}
var newObj = deepclone(orgObj)
orgObj.a.b='d'

//{a:{b:'c'}} newObj中a.b的值不会改变 
上一篇 下一篇

猜你喜欢

热点阅读