JS 深浅拷贝

在日常开发当中那面会遇到对象拷贝问题

一、对象浅拷贝(shallowClone)

  1. 使用 Object.assign 把源对象自身的、可枚举的属性拷贝到目标对象上

    var person = {
      name: '张三',
      age: 18,
      sex: '男',
      hobbies: ['篮球', '足球', '排球'],
      sayName: function () {
        console.log(this.name);
      },
      play: null,
      info: {
        address: '四川成都',
        child: [
          {
            id: 1,
            name: '张小三',
            age: 5,
            sex: '女'
          }
        ]
      }
    };
    
    var newPerson = Object.assign({}, person);
    console.log(newPerson);
    

    拷贝后新旧对象的对比:
    在这里插入图片描述

    但是当我操作对象里面更深层次的属性之后:
    在这里插入图片描述
    结果把源数据给改了
    在这里插入图片描述

  2. 使用 for in 遍历拷贝

    function shallowClone(target, origin) {
    	var tar = target || {};
    	
    	for (var key in origin) {
    		// 过滤原型上的属性
    		origin.hasOwnProperty(key) && (target[key] = origin[key]);
    	}
    
    	return tar;
    }
    

二、深拷贝(deepClone)

  1. 使用 for in 循环遍历 + 递归

    • 判断是不是原型上的属性
    • 判断是引用值(注意:typeof null === 'object')还是原始值
    • 如果是引用值就递归继续拷贝,否则就直接拷贝
    • 把拷贝好的对象 return 出去
    function deepClone(target, origin) {
      var target = target || {},
          toStr = Object.prototype.toString,
          arrType = '[object Array]';
    
      for (var key in origin) {
        if (origin.hasOwnProperty(key)) {
          if (typeof origin[key] === 'object' && origin[key] !== null) {
            target[key] = toStr.call(origin[key]) === arrType ? [] : {};
            deepClone(target[key], origin[key]);
          } else {
            target[key] = origin[key];
          }
        }
      }
    
      return target;
    }
    

    当我操作拷贝之后的对象:
    在这里插入图片描述
    结果源对象不会发生改变:
    在这里插入图片描述

  2. 简单粗暴直接 JSON.parse(JSON.stringify(originObj));

    function deepClone(target, origin) {
      var target = target || {};
      target = JSON.parse(JSON.stringify(origin));
      return target;
    }
    

    记得初学的时候,以为一个对象赋值另一个空对象(newObj = originObj)就可以达到拷贝的效果,结果后来操作被赋值的那个对象之后,没想到源对象也修改了(后来才知道因为它俩用的是同一个引用地址的东西,呜呜呜~)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iteval

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值