js对象之浅拷贝和深拷贝

浅拷贝依次遍历内容,依次赋值

    var p={
        name:"zhuyu",
        age:20
    };
    var k={   
    };
    console.log(p);
    console.log(k);
    for(let key in p){
        k[key]=p[key];
    }
    console.log(p);
    console.log(k);

使用Object.assign()方法,这个方法的作用

<script>
       //方法二:使用Object原型方法
    var p={
        name:"zhuyu",
        age:20
    };
    var k={
        weight:"120",
        height:175   
    };

    console.log("方法二打印---------------------")
    Object.assign(k,p);
    console.log(p);
    console.log(k);
</script>

问题来,你这样依次拷贝出现的问题就是对象里面含有对象或者数组,Date等属性,又会出现只拷贝地址的情况,解决方法只有采用递归的方式拷贝。

 

var o = {
  name: "zhuyu",
  age: 21,
  ts: {
    weight: 50,
    height: 180,
    arr: [15, 4, 5, 6]
  }
}
var b = {

}

function isObject(obj) {
  return obj instanceof Object;
}

function deepCopy(fa, fb) {
  for (let key in fb) {
    if (!isObject(fb[key])) {
      fa[key] = fb[key]
    } else {
      tempConstruc = new fb[key].constructor;
      deepCopy(tempConstruc, fb[key]);
      fa[key] = tempConstruc;
    }
  }
}

deepCopy(b, o);
var arr1 = [1, 4, 8];
var arr2 = [];
deepCopy(arr2, arr1)
console.log(arr2);
console.log(b);

深拷贝第二种封装:

 <script>
        function copy(obj1, obj2) {
            for (let i in obj1) {

                if (typeof obj1[i] == "object") {
                    obj2[i] = (obj1[i].constructor == Array) ? [] : {};
                    copy(obj1[i], obj2[i])
                } else {
                    obj2[i] = obj1[i];
                }
            }
        };
        var a = {
            name: "zhuyu",
            age: 21,
            uni: {
                first: 1,
                second: 2
            }
        }
        var b = {};
        copy(a, b);
        console.log(a);
        console.log(b);
    </script>

效果:

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值