js深度克隆(深度赋值)

克隆

浅度克隆:原始类型为值传递,对象类型为引用传递

深度克隆:所有对象的属性和值均全部复制,即所有新对象的修改不会影响原对象。

函数的克隆通过浅克隆就可以实现,并不影响原函数。因为函数克隆会在内存中单独开辟一片空间,互不影响。

var n=function(){
alert(1);

}

var m=n;

m=function(){

alert(2);

}

Console.log(n());//1

Console.log(m());//2

克隆对象必须用深度克隆。浅度克隆,克隆的是对象的引用,等到修改克隆对象时会修改原对象。

第一种方法:

下面是我从某网上敲下来别人的代码:

function deepclone(parent,child){
    child=child||{};
    for(var i in parent){
        //检查当前对象是否有这个属性
        if(parent.hasOwnProperty(i)){
            //如果当属性为对象,还要判断其是否为数组
            if(typeof parent[i]==="object"){
                child[i]=(Object.prototype.toString.call(parent[i]==='[object Array]')?[]:{});
                //调用递归
                deepclone(parent[i],child[i]);
            }else{
                child[i]=parent[i];
            }
        }
    }
    return child;
}
var dad={
    counts:[1,2,3],
    reads:{paper:true}
};
var kids=deepclone(dad);
console.log(deepclone(dad,kids));
kids.counts.push(4);
 kids.reads.paper=false;
 console.log(kids.counts);
 console.log(kids.reads.paper);
 console.log(dad.counts);
 console.log(dad.reads.paper);

运行结果:

利用上面这种方法实现深度克隆需要注意以下几点:

  1. 先判断当前遍历的属性为对象。
  2. 由于数组也是特殊的对象,所以还需要判断是不是数组。
  3. 如果是数组创建一个空[],如果是一个对象创建一个空{},并且赋值给当前子对象的属性,然后调用递归克隆函数。

第二中方法:利用Json.parse()和json.stringify.  利用内置函数处理起来会比较快。

JSON.stringify()将对象转换成json字符串

JSON.parse()将json字符串转换成对象

function deepclone(parent,child){
    var i;
    var proy;
    proy=JSON.stringify(parent);
    proy=JSON.parse(proy);
    child=child||{};
    for(var i in proy){
        if(proy.hasOwnProperty(i)){
            child[i]=parent[i];
        }
    }
    proy=null;//由于proy是中间对象所以可以回收
    return child;
}
    var dad={
        interst:['football','basketball'],
        tall:{
            data:true
        }
    };
    var kid=deepclone(dad);
kid.interst.push('pingpang');
kid.tall.data=false;
console.log(kid.interst);
console.log(kid.tall.data);
console.log(dad.interst);
console.log(dad.tall.data);

运行结果:

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值