【JS第1期】深拷贝实现原理

本文通过JavaScript示例详细解释了浅拷贝与深拷贝的概念及实现方式,展示了如何避免因对象引用导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,从copy开始说,简而言之,copy的目的就是生成一个新的实例,然后把其成员都按原实例赋值。对于非指针型的成员,比如boolern、String、Number等,这样的赋值可以直接进行。但是对于指针型的数据,比如Object,就有深拷贝和浅拷贝的区别。我们接下来通过示例来进行介绍:

浅拷贝

// demo1.js
var obj = {
  name: 'bill',
  sex: '1',
  getName: function() {
    return this.name;
  },
  config: {
    birstary: '1992-02-02',
    isTrue: true
  }
}
    
function copy(obj) {
  var o = {}
  for (let i in obj) {
      o[i] = obj[i]    
  }
  return o;
}
var obj2 = copy(obj);
obj2.name = 'bill2'
obj2.config.isTrue = false
console.log(obj2)
console.log(obj)
复制代码

通过demo1.js我们可以了解到,我们修改了obj2的属性name,以及obj2中config对象内的属性isTrue。打印查看结果后发现,obj的config对象内的属性isTrue也跟着变了。这是因为config是一个对象,我们在copy的时候只是将config对象的指针进行了拷贝,而原对象并没有进行拷贝。所以,如果我们想修改obj2的config对象内的属性而不影响obj的话我们就需要深拷贝,具体实现如下:

var obj = {
  name: 'bill',
  sex: '1',
  getName: function() {
    return this.name;
  },
  config: {
    birstary: '1992-02-02',
    isTrue: true
  }
}

function copy(obj) {
  var o = {}
  for (let i in obj) {
    if (obj[i].toString() == '[object Object]') {
      var obj2 = copy(obj[i])
      o[i] = obj2;
    } else {
      o[i] = obj[i]
    }
    
  }
  return o;
}
var obj2 = copy(obj);
obj2.name = 'bill2'
obj2.config.isTrue = false
console.log(obj2)
console.log(obj)
复制代码

我们运用递归的方法,检测是否是Obejct。如果不是直接赋值,如果是,我们再对Object进行拷贝。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值