浅拷贝和深拷贝

浅拷贝:拷贝所有的属性值到新的对象中,如果属性值是对象的,拷贝的则是地址。
  • Object.assign()
	let p1 = {
		age : 10,
		jobs:{
			first:'xxx'
		}
	}
	let p2 = Object.assign({} , p1);
	
	p1.age = 20;
	p1.jobs.first = 'zzz';
	
	console.log(p2.age)				//  10
	console.log(p2.jobs.first)   //    zzz
  • …(展开运算符)
	let p1 = {
		age : 10
	}
	let p2 = {...p1}
	p1.age = 20;
	console.log(p2.age)	//  10
深拷贝:拷贝所有的属性值到新的对象中,如果属性值是对象也不影响。
  • JSON.parse(JSON.stringify(object)):

但是该方法有局限性:

  • 忽略undefined
  • 忽略symbol
  • 不能序列化函数
  • 不能解决循环引用对象
	let p1 = {
		age : 10,
		jobs:{
			first:'xxx'
		}
	}
	let p2 = JSON.parse(JSON.stringify(p1));
	
	p1.age = 20;
	p1.jobs.first = 'zzz';
	
	console.log(p2.age)				//  10
	console.log(p2.jobs.first)   //    xxx
  • 递归
 function deepClone(obj = {}){
 
   if(typeof obj !== 'object' || obj == null){
     return obj
   }

   let result
   if(obj instanceof Array){
     result = []
   }else{
     result = {}
   }

   for(let key in obj){
     if (obj.hasOwnProperty(key)) {
         result[key] = deepClone(obj[key])
     }
   }

   return result

 }

实现一个深拷贝需要考虑很多情况:DOM如何处理,原型链如何处理等,推荐使用:lodash的深拷贝函数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值