所谓的深浅拷贝是相对与typeof === 'object' 而言的,数组是用堆对应保存的。
浅拷贝:拷贝了对象的存放地址,只是指向相同而已 (只解决了第一层,对象中还有对象就不适用了)
深拷贝:完全复制了一个独立的个体
1、 浅拷贝 (指向同一个存放地址)
let arr1 = [1,3,5];
let arr2 = arr1;
arr1[0] = 10;
console.log(arr2) // [10,3,5]
2、深拷贝
- 2.1 返回新数组方法 slice() 、 contat()、 map()
let arr1 = [2,5,7];
let arr2 = arr1.slice(0);
let arr3 = arr1.contat();
let arr4 = arr1.map(x => x);
arr2[0] = 4;
arr1[0] = 99;
console.log(arr1,arr2) // [99,5,7] [4,5,7]
- 2.2 ES6扩展运算符实现数组的深拷贝
let arr = [1,3,5];
let arr1 = [...arr];
- 2.3 for-in连原型链也一并复制的方法
let arr = [1,3,5];
let arr2 = [] ;
for(var key in arr) {
arr2[key] = arr[key]
}
- 2.4 使用数组遍历赋值
let arr = [1,2,4];
let arr2 = [];
arr.foreach((ele,index) =>{
arr2[index] = ele;
})
- 2.5 多维数组复制
let arr = [1,[1,4],5,[{name:'bobo'}]];
let arr2 = JSON.parse(JSON.stringify(arr));
console.log(arr2) // [1,[1,4],5,[{name:'bobo'}]]
总结了这么多方法实现深拷贝,下面总结一个完整的深拷贝的实现方法
DeepCopy (obj) {
let str;
let newobj;
if (typeof obj !== 'object') {
return obj;
} else if (window.JSON) {
str = JSON.stringify(obj);
newobj = JSON.parse(str);
} else {
newobj = obj.constructor === Array ? [] : {};
for (var i in obj) {
newobj[i] = typeof obj[i] === 'object' ? this.DeepCopy(obj[i]) : obj[i];
}
}
return newobj;
},