深拷貝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}};
複製代碼
相關文章
相關標籤/搜索