深拷贝与浅拷贝

浅拷贝:将对象中的各个属性依次进行复制,浅拷贝只复制了一层对象的属性。如果对象属性中还有对象,那么赋值的仅仅是地址。还是会相互影响。

深拷贝:将对象中的各个属性一次进行复制,深拷贝会递归赋值所有层对象的属性。如果对象属性中还有对象,会继续拷贝,这样拷贝出来的对象完全独立。

一、浅拷贝

1、封装一个函数, 能够拷贝一个对象 传入一个对象,返回一个新对象

function copy(obj) {
      var newObj = {};
      for(var k in obj) {
        // 不管是简单类型还是值类型, 直接进行了拷贝
        // 如果是复杂类型,直接拷贝,拷贝的仅仅是个地址
        newObj[k] = obj[k];
      }
      return newObj;
    }

2、创建一个新的对象

var obj = {
      name: '张三',
      age: 18,
      car: {
        brand: '奔驰',
        price: 100
      }
    }

3、调用copy函数

var newObj = coby(obj);

//修改newObj中的属性
newObj.name = '李四';
newObj.car.brand = '宝马';

// 打印obj中的属性值

console.log(obj.name);// 张三

console.log(obj.car.brand);//宝马

可以看出newObj只复制了obj中第一层属性,当改变newObj中car对象的属性值时obj中的car的属性值也跟着改变了,所以对于里面的car对象只是复制了一个地址,newObj中的car与obj中的car指向同一个car对象

 

二、深拷贝

function deepCopy(obj) {
      var newObj = {};
      for(var k in obj) {
        // 判断 obj[k] 的类型, 如果是简单类型,直接拷贝  如果是复杂类型,需要继续拷贝
        // console.log(obj[k]);
        // if (typeof obj[k] === 'object') {
        //   // 如果obj[k]是复杂类型, 需要拷贝一份这个对象,交给newObj
        //   newObj[k] = deepCopy(obj[k]);
        // } else {
        //   newObj[k] = obj[k];
        // }
        newObj[k] = typeof obj[k] === 'object' ? deepCopy(obj[k]) : obj[k];
      }
      return newObj;
    }

调用deepCopy函数

var obj = {
      name: '张三',
      age: 18,
      car: {
        brand: '奔驰',
        price: 100
      }
    }

var newObj = coby(obj);

//修改newObj中的属性
newObj.name = '李四';
newObj.car.brand = '宝马';

// 打印obj中的属性值

console.log(obj.name);// 张三

console.log(obj.car.brand);//奔驰

可以看出newObj不仅拷贝了第第一层属性,car对象也完全拷贝了,当改变newObj中car对象的属性值时obj中的car对象的属性值并没有改变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值