深浅拷贝的区别

文章介绍了JavaScript中浅拷贝和深拷贝的概念,浅拷贝包括使用Object.assign()和展开运算符,只适合单层对象;深拷贝可通过递归实现或使用lodash的cloneDeep方法,以及借助JSON.stringify()。文中通过示例展示了它们的区别,特别是在处理复杂数据类型时的差异。
摘要由CSDN通过智能技术生成

1浅拷贝

首先浅拷贝和深拷贝只针对引用类型

浅拷贝:拷贝的是地址

常见方法:

  1. 拷贝对象:Object.assgin() / 展开运算符 {...obj} 拷贝对象

  2. 拷贝数组:Array.prototype.concat() 或者 [...arr]

如果是简单数据类型拷贝值,引用数据类型拷贝的是地址 (简单理解: 如果是单层对象,没问题,如果有多层就有问题)(改变地址后会影响

不足:

浅拷贝只适合单层,里面不能再有复杂数据类型,不然还是拷贝地址

如果是简单数据类型拷贝值,引用数据类型拷贝地址

(简单理解:如果是单层对象,没问题,如果有多层,有问题)

到原来的值)

2深拷贝

深拷贝:拷贝的是对象,不是地址,思想是递归

实现深拷贝的常见方法:

  1. 通过递归实现深拷贝

  2. lodash/cloneDeep

  3. 通过JSON.stringify()实现

 const obj = {//对象
     uname: 'pink',
       age: 19
     }
     // 3使用场景:适用于对象都是简单数据类型
    // 浅拷贝和深拷贝只针对于引用类型

//浅拷贝
    // 方法1:展开运算符
    const o = { ...obj }
    console.log(o);
    o.age = 20
    console.log(o.age);//20
    console.log(obj.age);//19

    // 方法2:assign
    const o = {}
    Object.assign(o, obj)
    o.age = 20
    console.log(o.age);//20
    console.log(obj.age);//19
    
//深拷贝
  const obj = {
    uname: 'Normi',
    age: 22,
    hobby: ['篮球', '排球']
  }

  // 1递归
  // const o = {}
  // function fn(newObj, oldObj) {
  //   for (let k in oldObj) {
  //     if (oldObj[k] instanceof Array) {//✿
  //       newObj[k] = [] // ✿
  //       fn(newObj[k], oldObj[k])

  //     } else {

  //       newObj[k] = oldObj[k]//简单数据类型赋值
  //     }
  //   }
  // }
  // fn(o, obj)
  // console.log(o);
  // o.hobby[0] = '我修改了'
  // console.log(o);
  // console.log(obj);

  // 2lodash
  // const o = _.cloneDeep(obj)


  // 3:JSON
  const o = JSON.parse(JSON.stringify(obj))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值