浅谈深克隆和浅克隆

浅克隆和深克隆都是对引用地址的克隆。
浅克隆
浅克隆就是当我把obj{}对象里面的所有属性拷贝到obj1{}中后,然后我分别改变对象里面的变量,原始值互不影响,引用值一个改变,另一个跟着变。
代码如下:

function clone(origin, target) {
  var target = target || {}
  for (var item in origin) {
    target[item] = origin[item]
  }
  return target
}
var obj = {
  name: '小哥',
  age: 102,
  sex: 'male'
}
var obj2 = {}
clone(obj, obj2) 
obj.name = '李四'
console.log(obj, obj2)

改变其中一个值,另一个值不会改变
在这里插入图片描述
深克隆
所有元素或属性均完全克隆,并于原引用类型完全独立,即,在后面修改对象的属性的时候,原对象不会被修改

var obj = {
  name: '小哥',
  age: 120,
  sex: 'male',
  hobby: ['冒险', '耍帅', '练武'],
  boyfriend: {
    name: '小三爷',
    age: 28
  }
}
var obj2 = {}
deepClone(origin ,target) {
  var target = target || {}, //容错处理,防止用户不传target值
        toStr = Object.prototype.toString,
        arrAtr = "[object Array]"
  for(var item in origin) { //遍历对象
    if (origin.hasOwnProperty(item)) { //防止拿到原型链属性
      if (origin[item] !== null && typeof (origin[item]) === 'object') { //判断是不是原始值
        target[item] = (toStr.call(origin[item]) === arrAtr) ? [] : {} //建立相对应的数组或对象
        deepClone(origin[item], target[item]) //递归,为了拿到引用值里面还有引用值
      } else {
        taget[item] = origin[item] //是原始值,直接拷贝
      }
    }
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值