javascript中的克隆对象与copy的区别

javascript中的克隆对象与copy的区别

今天在项目中创建一个类似的## 标题 ##对象,可惜数据量太大,无论怎么操作,我指向的都是同一个对象,最后发现了一个问题,就是克隆与copy的区别。

  这次的项目从后台传出来的数据缺失,需要前端根据已有的数据来补充,这是我的项目中的数据:
这里写图片描述
  我想在内存中创建一个对象和键为19的一系列内容相同,然后我用了copy:

    function deepCopy(fathers, childs) {
        var childs = childs || {};
        for (key in fathers) {
            if (fathers[key] instanceof Array) {
                childs[key] = []; //当copy的属性为数组
                deepCopy(fathers[key], childs[key]);
            } else {
                childs[key] = {}; //当copy的属性为对象
                childs[key] = fathers[key];
            }
        }
        return childs;
    } 
    for (var i=0; i<noDataIndex.length; i++) {
        for (key2 in data2Obj) {  
            var tempArrs = deepCopy(data2Obj[key2]);  //克隆一个类似对象
            if (tempArrs) { 
                break;
            }
        }
        console.log(**tempArrs**)
        for(key3 in tempArrs){
            tempArrs[key3].Total = 0;
        }
        data2Obj[noDataIndex[i]] = tempArrs;
    }

  随后发现,我copy出的tempArr和原来的对象指向同一个内存。然后我用了克隆的方法,然后就可以实现他们指向不同的内存了,以下是我的克隆方法,希望大家以后遇到可以用这个,比copy好用,如果非要问个具体原因,我想只有动手才能发现区别,我的项目太复杂,只有用到constructor才能清楚判断对象的构造函数来源是谁,而上面的方法不能清楚地判断:
方法一:

    function clone2(father){  
        var child, father;  
        if (father.constructor == Object){  
            child = new father.constructor();   
        }else{  
                        //valueOf() 方法返回 Array 对象的原始值
            child = new father.constructor(father.valueOf());   
        }  
        for(var key in father){  
            if ( child[key] != father[key] ){   
                if ( typeof(father[key]) == 'object' ){   
                    child[key] = clone2(father[key]);  
                }else{  
                    child[key] = father[key];  
                }  
            }  
        }  
        child.toString = father.toString;  
        child.valueOf = father.valueOf;  
        return child;  
    }  

另外我再推荐几个常用的克隆方法:
方法二:

function clone(obj){  
    var o;  
    switch(typeof obj){  
    case 'undefined': break;  
    case 'string'   : o = obj + '';break;  
    case 'number'   : o = obj - 0;break;  
    case 'boolean'  : o = obj;break;  
    case 'object'   :  
        if(obj === null){  
            o = null;  
        }else{  
            if(obj instanceof Array){  
                o = [];  
                for(var i = 0, len = obj.length; i < len; i++){  
                    o.push(clone(obj[i]));  
                }  
            }else{  
                o = {};  
                for(var k in obj){  
                    o[k] = clone(obj[k]);  
                }  
            }  
        }  
        break;  
    default:          
        o = obj;break;  
    }  
    return o;     
} 

方法三:

function clone3(obj){  
    function Clone(){}  
    Clone.prototype = obj;  
    var o = new Clone();  
    for(var a in o){  
        if(typeof o[a] == "object") {  
            o[a] = clone3(o[a]);  
        }  
    }  
    return o;  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值