1. 首先使用JSON.parse來實(shí)現(xiàn)一個(gè)深拷貝
let test = {
x : 1,
y : 2,
z : {
a : 4,
b : 5
}
}
// 深拷貝
let result = JSON.parse(JSON.stringify(test));
// 改變拷貝后的值
result.z.a = 40;
console.log(test);
console.log(result);
2. 手寫實(shí)現(xiàn)深拷貝
function deepClone(obj){
let cloneObj;
// 判斷當(dāng)輸入的數(shù)據(jù)是簡單數(shù)據(jù)類型時(shí),直接復(fù)制
if(obj && typeof obj !== 'object'){
cloneObj = obj;
}
// 當(dāng)輸入的數(shù)據(jù)是對象或者數(shù)組時(shí)
else if(obj && typeof obj === 'object'){
// 檢測輸入的數(shù)據(jù)是數(shù)組還是對象
cloneObj = Array.isArray(obj) ? [] : {};
// 變量數(shù)據(jù)對象
for(let key in obj){
// 判斷對象是否存在key屬性
if(obj.hasOwnProperty(key)){
if(obj[key] && typeof obj[key] === 'object'){
// 若當(dāng)前元素類型為對象時(shí),遞歸調(diào)用
cloneObj[key] = deepClone(obj[key]);
}
// 若當(dāng)前元素類型為基本數(shù)據(jù)類型
else{
cloneObj[key] = obj[key];
}
}
}
}
return cloneObj;
}
// 測試用例
deepClone({
x: 1,
y: [ 5, 6, 7 ],
z: {
a: 0,
b: 1
}
})
測試發(fā)現(xiàn)兩種效果是一樣的,深拷貝完成。