深拷贝vs浅拷贝

怎么解释深拷贝和浅拷贝?

简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。

常见的浅拷贝有哪些?

1. ...运算符
let obj={name:'jack',address:'shanghai'}
let o = {...obj};
obj.name = 'hello';
console.log(o); //=>{name: "jack", address: "shanghai"}

复制代码

这个看起来有点像深拷贝是不是? 别急再来一点变化。

let obj={name:'jack',address:{city:'shanghai',num:1}}
let o = {...obj};
obj.name = 'hello';obj.address.city='beijing'
console.log(o); 
//{name: "jack", address:{city: "beijing",num: 1}}

复制代码

所以我们知道深拷贝不仅仅是一维不影响并且朵唯也不影响。所以...运算符是浅拷贝;

2.slice/concat 这两个方法和1是一样的 一维的时候是深拷贝 但是多维是浅拷贝

如果实现深拷贝?

1.Json.parse 和json.stringify();
功能不完整 不能实现复杂的拷贝 例如函数。
2.递归拷贝
function deepClone(obj){
	if(obj == null) return obj;
	if(obj instanceof Date) return new Date(obj);
	if(obj instanceof RegExp) return new RegExp(obj);
	if(typeof obj !=='object') rerurn obj;
	let cloneObj = new obj.constructor;
	//找到数组或者对象的原型;
	for(let key in obj){
	   if(obj.hasOwnPrototype(key){
	   //实现递归拷贝
	       cloneObj[key] = deepClone(obj[key]);
	   } 
	}
	return cloneObj;
	
}
let obj = {name:1,address:{name:'shanghai',num:1}};
复制代码

转载于:https://juejin.im/post/5cc00b6d5188250a7f630e93

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值