浅复制与深复制

浅复制

举个复制代码的例子:

function clone(p,s) {
  var s = s || {};
  for (var prop in p) {
    s[prop] = p[prop];
  }
  return s;
}

var a = {name: ’Chen‘,age: '12', hobby: {1: 'running', 2: 'swimming'}};
var b = {};
clone(a,b);
b.hobby[1] = 'reading';
b.hobby[1]      // 'reading'
c.hobby[1]     //  'reading' 

由上面的例子可以看出,当执行浅复制时,如果对象里包含子对象,当我们对b对象进行修改时c对象也会受到影响,这是因为浅复制是复制引用,复制后的引用都是指向同一个对象的实例,因此彼此之间的操作会互相影响

深复制

现在我们来对浅复制的代码进行一下小小改动,实现深复制:

function deepClone(p,s) {
  var s = s || {};
  for (var prop in p) {
    if (typeof p[prop] == 'object') {
      s[prop] = (p[prop].constructor === Array)?[]:{};
      deepClone(p[prop],s[prop]);
    } else{
      s[prop] = p[prop];
    }
  }
  return s;
}

var a = {name: ’Chen‘,age: '12', hobby: {1: 'running', 2: 'swimming'}};
var b = {};
clone(a,b);
b.hobby[1] = 'reading';
b.hobby[1]   //  'reading'
c.hobby[1]   //  'running'

由上例子可知,深复制可以解决浅复制的弊端,对于b对象进行修改时c对象也不会受到影响,这是因为深复制不是简单的复制引用,而是在堆中重新分配内存,并且把源对象实例的所有属性都进行新建复制,以保证深复制的对象的引用图不包含任何原有对象或对象图上的任何对象,复制后的对象与原来的对象是完全隔离的。由深复制的定义来看,深复制要求如果源对象存在对象属性,那么需要进行递归复制,从而保证复制的对象与源对象完全隔离。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值