深拷贝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"}

复制代码

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

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是同样的 一维的时候是深拷贝 可是多维是浅拷贝bash

若是实现深拷贝?

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}};
复制代码
相关文章
相关标签/搜索