所謂的深淺拷貝是相對(duì)與typeof === 'object' 而言的创橄,數(shù)組是用堆對(duì)應(yīng)保存的箩做。
淺拷貝:拷貝了對(duì)象的存放地址,只是指向相同而已 (只解決了第一層妥畏,對(duì)象中還有對(duì)象就不適用了)
深拷貝:完全復(fù)制了一個(gè)獨(dú)立的個(gè)體
1邦邦、 淺拷貝 (指向同一個(gè)存放地址)
let arr1 = [1,3,5];
let arr2 = arr1;
arr1[0] = 10;
console.log(arr2) // [10,3,5]
2、深拷貝
- 2.1 返回新數(shù)組方法 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擴(kuò)展運(yùn)算符實(shí)現(xiàn)數(shù)組的深拷貝
let arr = [1,3,5];
let arr1 = [...arr];
- 2.3 for-in連原型鏈也一并復(fù)制的方法
let arr = [1,3,5];
let arr2 = [] ;
for(var key in arr) {
arr2[key] = arr[key]
}
- 2.4 使用數(shù)組遍歷賦值
let arr = [1,2,4];
let arr2 = [];
arr.foreach((ele,index) =>{
arr2[index] = ele;
})
- 2.5 多維數(shù)組復(fù)制
let arr = [1,[1,4],5,[{name:'bobo'}]];
let arr2 = JSON.parse(JSON.stringify(arr));
console.log(arr2) // [1,[1,4],5,[{name:'bobo'}]]
總結(jié)了這么多方法實(shí)現(xiàn)深拷貝,下面總結(jié)一個(gè)完整的深拷貝的實(shí)現(xiàn)方法
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;
},