js对象浅拷贝和深拷贝

1、浅拷贝

var obj = {a:10}; //定义一个对象
function copy(obj){ //定义一个复制对象的方法,参数就是要复制的对象
    var newObj = {}; //定义一个空对象,用来保存key和value
    for ( var key in obj) { //遍历传入的对象
        newObj[key] = obj[key]; //将传入的对象的key和value存入新对象中
    }
    return newObj; //将新对象作为返回值,返回到外面
}
var obj2 = copy(obj); //将obj复制给obj2
obj2.a = 20; //改变obj2中的a的值为20
console.log(obj.a); //obj中a的值不变 10

但是这里存在一个问题,如果a的值是一个对象,例如:var obj = {a: {b: 10}};

在使用for in 遍历时,新对象会同时指向a的内存地址,导致修改新对象的值会对原对象有影响;

遇到这种情况时,我们需要深拷贝。

2、深拷贝

var obj = {a:{b:10}};//定义一个对象
function deepCopy(obj){//定义一个复制对象的方法,参数就是要复制的对象
    if(typeof obj != 'object'){ //如果这个参数的类型不是object
        return obj; //那么直接返回这个参数
    }
    var newObj = {}; //否则定义一个空对象,用来保存key和value
    for ( var attr in obj) {//遍历传入的对象
        newObj[attr] = deepCopy(obj[attr]); //用递归的方式将对象中属性的key和value存入新对象中
    }
    return newObj;//将新对象作为返回值,返回到外面
}
var obj2 = deepCopy(obj);//将obj复制给obj2
obj2.a.b = 20;//改变obj2中的属性a中b的值为20
console.log(obj.a.b); //obj中属性a中b的值不变 10

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值