js深拷贝浅拷贝

#每日学习前端#

浅拷贝

只拷贝当前对象的属性 两个对象指向同一个地址 修改一个对象的属性,另一个对象会跟着一起改变

- Object.assign

- Array.prototype.slice

- Array.prototype.concat

- 扩展运算符

// 浅拷贝案例
let a = { name: "张三" };
let b = { age: 18 };
let c = Object.assign(a, b);
console.log("c1", c); //{ name: '张三', age: 18 }

// 修改a的属性 c的属性也会跟着改变
a.name = "李四";
a.age = 19;
console.log("c2", c); //{ name: '李四', age: 19 }

 

深拷贝

开辟新的栈 两个对象完全相同 对应不同的地址 修改一个对象的属性,另一个对象不会跟着一起改变

- _cloneDeep() lodash 深拷贝函数

- jQuery.extend()

- JSON.stringify()存在弊端 undefined symbol 函数

- 手写循环递归

 

// 深拷贝案例
let d = {
  name: "Jack",
  like: "apple",
  eat: undefined,
  fn: function () {},
  nn: null,
  test: Symbol("test"),
};
let e = JSON.parse(JSON.stringify(d)); 
console.log("e1", e);// { name: 'Jack', like: 'apple', aa: null }
// 说明undefined 函数 null Symbol类型无法被拷贝

d.name = "popop";
console.log("e2", e); // { name: 'Jack', like: 'apple', aa: null }

// 手写深拷贝函数
let f = {
    name: "Jack",
    like: "apple",
    eat: undefined,
    fn: function () {},
    nn: null,
    test: Symbol("test"),
};
function deepCopy(data) {
   // 判断当前参数是否是复杂数据Object类型
  if (data instanceof Object) {
    let copy = {};
    if (data instanceof Array) {
      copy = [];
    }
    for (const key in data) {
        // 如果属性中有复杂数据Object类型 进行递归循环
      if (data[key] instanceof Object) {
        copy[key] = deepCopy(data[key]);
      } else {
        copy[key] = data[key];
      }
    }
    return copy;
  } else {
    // 基本类型直接赋值
    return data;
  }
}

console.log(deepCopy(f));

不积跬步,无以至千里;不积小流,无以成江海。奥利给~ 

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值