深拷貝與淺拷貝的區(qū)別:例如B復(fù)制了A,如果A改變了仔雷,B也跟著改變,則是淺拷貝;如果A改變了朽寞,B沒(méi)有改變识窿,則是深拷貝。
深拷貝會(huì)拷貝所有層級(jí)的屬性
(1).JSON.stringfy和JSON.parse來(lái)回轉(zhuǎn)換一次可以實(shí)現(xiàn)深拷貝脑融;
代碼示例:
let a = [1,2,3,[4,5],6]; //多層數(shù)組
let A = JSON.stringify(a); //JSON.stringify轉(zhuǎn)換
let b = JSON.parse(A);? ? //JSON.parse轉(zhuǎn)換
console.log(a,b)
a[0] = 2;
console.log(a,b);
輸入結(jié)果如圖1喻频,圖2;
由此可見(jiàn)此次拷貝為深拷貝
(2).使用遞歸循環(huán)來(lái)為數(shù)組賦值也可實(shí)現(xiàn)深拷貝
let a = [1,2,3,4,5,[6,7],8,9];
function deepClone(obj){
let b = Array.isArray(obj)?[]:{};? //判斷傳入數(shù)據(jù)的格式是否為array
for(key in obj){? ? //遍歷數(shù)組
if(obj[key] && typeof obj[key] === "object"){? //如果該索引下存在數(shù)據(jù)切類(lèi)型為object肘迎,再次調(diào)用改函數(shù)來(lái)循環(huán)內(nèi)部的數(shù)組
b[key] = deepClone(obj[key]);
}else{
b[key] = obj[key]? ? //其他情況下為新數(shù)組賦值
}
}
return b;? ? //返回遞歸完成的數(shù)據(jù)
}
let b = deepClone(a);
console.log(a,b);
a[0] = 2;
a[5][0] = 1;
console.log(a,b);
輸出結(jié)果如圖3甥温,圖4;
由此可見(jiàn)妓布,遞歸之后所得的數(shù)據(jù)為深拷貝姻蚓。