淺拷貝
1.基本數據類型 是存在棧中的,所以=賦值,都會創建一個新的空間,例如
var a = 4;
b = a;
變量b有自己獨立的空間
2.對象數據類型 是存在堆中的,=賦值,并不會創建新的空間,只是引用,例如
var a={};
b=a;
變量b只是一個引用,指向了a的空間,這其實就是淺拷貝
深拷貝
- 數組
數組的slice和concat方法能把由基礎數據組成的數據,拷貝出一個新對象
var arr=['a','b','c'];
var arrCopy=arr.slice(0);
var arrCopy2=arr.concat();
- 對象
下面實現一種對象深拷貝;
另外Object.assgin也能深拷貝,但它不會遞歸遍歷拷貝,只拷貝目標對象的屬性,深層屬性不拷貝;
第三種可以使用json的特性來做深度拷貝;
1.Object.prototype.deepCopy=function(){
var obj=null;//用于最后返回一個對象,這個對象是深復制的結果
for(var attr in this) {//遍歷這個對象的每一個屬性
if(this.hasOwnProperty(attr)){//主要是遞歸自有屬性
if(typeof (this[attr]==='object')){//如果對象的屬性是一個對象,就遞歸復制它的每一個屬性
if(this[attr]===null){//如果對象為null
obj[attr]=null;
}else if(Object.prototype.toString(this[attr])==='[object Array]'){//如果是個數組
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));