浅拷贝
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));