深拷贝和浅拷贝

深拷贝和浅拷贝

当我们想拷贝一个已有的数组或者对象时,我们首先想到的是这样:
浅拷贝

<script>
  var obj = {
    name: 1,
    height: 1
  }
  var newObj = obj;
  setTimeout(() => {
    newObj.name = 2;
    newObj.height = 2;
    console.log(obj);//{name: 2, height: 2}
    console.log(newObj);//{name: 2, height: 2}
  }, 1000)
</script>

但是这样直接进行拷贝的话,当我们改变newObj的时候,obj也回改变,这肯定不对啊,这就不是我们I型那个要的结果,这时我们就要进行深拷贝。
深拷贝
深拷贝一般分为两种,一种是数组的深拷贝,一种是对象的深拷贝,他们各有自己的写法
(1)数组的深拷贝

function deepClone(obj) {
    var result = Array.isArray(obj) ? [] : {}; // 判断当前传进来的是对象还是数组
    for (var key in obj) {
      if (obj.hasOwnProperty(key)) { // 该key是否存在
        if (typeof obj[key] === 'object' && obj[key] !== null) { // obj[key]如果为object,递归调用该方法,obj[key] = arr || obj[key] = {}都为'object'
          result[key] = deepClone(obj[key]);
        } else {
          result[key] = obj[key];
        }
      }
    }
    return result;
  }
  let arr1 = [1, 2, 3, 4, 5];
  let arr2 = deepClone(arr1);
  arr2[0] = 'hello';
  arr2[4] = 'world';
  console.log(arr1); // [ 1, 2, 3, 4, 5 ]
  console.log(arr2); // [ 'hello', 2, 3, 4, 'world' ]

(2)对对象进行深拷贝

<script>

  var obj = {
    name: 1,
    height: 1
  }
  let newObj = JSON.parse(JSON.stringify(obj));
  newObj.name = 2;
  newObj.height = 2;
  console.log(obj);//{name: 1, height: 1}
  console.log(obj, newObj);//{name: 2, height: 2}
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值