淺拷貝
1.基本數(shù)據(jù)類(lèi)型 是存在棧中的,所以=賦值蜒茄,都會(huì)創(chuàng)建一個(gè)新的空間唉擂,例如
var a = 4;
b = a;
變量b有自己獨(dú)立的空間
2.對(duì)象數(shù)據(jù)類(lèi)型 是存在堆中的,=賦值檀葛,并不會(huì)創(chuàng)建新的空間玩祟,只是引用,例如
var a={};
b=a;
變量b只是一個(gè)引用屿聋,指向了a的空間空扎,這其實(shí)就是淺拷貝
深拷貝
- 數(shù)組
數(shù)組的slice和concat方法能把由基礎(chǔ)數(shù)據(jù)組成的數(shù)據(jù),拷貝出一個(gè)新對(duì)象
var arr=['a','b','c'];
var arrCopy=arr.slice(0);
var arrCopy2=arr.concat();
- 對(duì)象
下面實(shí)現(xiàn)一種對(duì)象深拷貝;
另外Object.assgin也能深拷貝润讥,但它不會(huì)遞歸遍歷拷貝转锈,只拷貝目標(biāo)對(duì)象的屬性,深層屬性不拷貝楚殿;
第三種可以使用json的特性來(lái)做深度拷貝撮慨;
1.Object.prototype.deepCopy=function(){
var obj=null;//用于最后返回一個(gè)對(duì)象,這個(gè)對(duì)象是深復(fù)制的結(jié)果
for(var attr in this) {//遍歷這個(gè)對(duì)象的每一個(gè)屬性
if(this.hasOwnProperty(attr)){//主要是遞歸自有屬性
if(typeof (this[attr]==='object')){//如果對(duì)象的屬性是一個(gè)對(duì)象脆粥,就遞歸復(fù)制它的每一個(gè)屬性
if(this[attr]===null){//如果對(duì)象為null
obj[attr]=null;
}else if(Object.prototype.toString(this[attr])==='[object Array]'){//如果是個(gè)數(shù)組
obj[attr]=[];
for(var i=0;i<this[attr].length;i++){
obj[attr].push(this[attr][i].deepCopy());
}
}else{//object
obj[attr]=this[attr].deepCopy();
}
}else{
obj[attr]=this[attr];
}
}
}
return obj;
}
2.Object.assign(target, ...sources);
3.JSON.parse(JSON.stringify(target));