js_三种方法实现深拷贝

  1. 深拷贝( 递归 )

适用于需要完全独立于原始对象的场景,特别是当对象内部有引用类型时,为了避免修改拷贝后的对象影响到原始对象,就需要使用深拷贝。

// 原始对象
const obj = { 
      uname: 'Lily',
      age: 19,
      hobby: ['乒乓球', '篮球'],
      family:{
        baby:'老baby'
      }
    }
    // 新对象
    const o = {} 
    // 拷贝函数
    function deepCopy(newObj, oldObj) {
      for(let k in oldObj){
        // 递归优先级 Array → Object
        // 判断对象属性是否为数组类型
        if(oldObj[k] instanceof Array){
          newObj[k] = []  // newObj[k] === o.hobby
          deepCopy(newObj[k], oldObj[k])
        }else if (oldObj[k] instanceof Object) {
          newObj[k] = {}  // newObj[k] === o.family
          deepCopy(newObj[k], oldObj[k])
        }
        else{
        // newObj[k] === o.uname
          newObj[k] = oldObj[k]   
        }
      }
    }
    deepCopy(o, obj)
    o.age = 20
    o.hobby[0] = '足球'
    o.family.baby = '小baby' 
    console.log(o)   
    console.log(obj) 

在这里插入图片描述

  1. 深拷贝( lodash )

Lodash 的 __.cloneDeep 方法可以实现深拷贝,它能够处理各种复杂的数据类型和嵌套结构。

语法规范:_.cloneDeep(value)

// 需要先在src中引入 lodash.min.js 文件
<script src="./js/lodash.min.js"></script>
<script>
	const obj = {
	      uname:'Lily',
	      age:18,
	      hobby:['乒乓球','足球'],
	      family:{
	        baby: '老baby'
	      }
	    }
	const o = _.cloneDeep(obj)
	o.family.baby = '小baby'
	console.log(o)  
	console.log(obj) 
</script>

lodash实现深拷贝

  1. 深拷贝( JSON )

JSON.stringify() 用于将JavaScript对象或值转换成一个JSON字符串

JSON.parse(text[, reviver]) 将一个符合JSON格式的字符串转换成JavaScript对象或数组

const obj = {
      uname:'Lily',
      age:18,
      hobby:['乒乓球','足球'],
      family:{
        baby: '老baby'
      }
    }
	const o = JSON.parse(JSON.stringify(obj))
	 // 将原对象转换成字符串后又转换为对象,这个新对象与原对象无关联
    console.log(o)
    o.hobby[0] = '篮球'
    o.family.baby = '小baby'
    console.log(obj)

在这里插入图片描述

  • 12
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

伐木累!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值