簡介: 在js當中,經常會遇到複製拷貝對象的場景,但是由於對象在內存中的存儲於一般普通數據類型值的存儲是不一樣的,一般值在內存中是直接存在棧當中的,而對象一般在棧中存一個引用(也可以理解爲指針),真正的值存儲在堆當中,棧中的引用指向堆中對應的值。
所以,在現實中,採用賦值形式的複製方式,會出現問題;如果對象裏的某個元素的值依然是一個對象,即多層對象,此時將這個對象複製給一個新對象,後面如果修改新對象裏的層級對象裏的值,此時會引起源對象裏對應值的變化,這樣就不是我們想要的效果。故深拷貝旨在解決此問題。(如果不太清楚棧,堆相關知識,可自行百度學習)
- 一般方式:
function deepClone(obj){
let objClone = Array.isArray(obj)?[]:{};
if(obj && typeof obj==="object"){
for(key in obj ){
if(obj.hasOwnProperty(key)){
//判斷ojb子元素是否爲對象,如果是,遞歸複製
if(obj[key] && typeof obj[key] ==="object"){
objClone[key] = deepClone(obj[key]);
}else{
//如果不是,簡單複製
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
- 簡易方式:
function deepClone (obj) {
return JSON.parse(JSON.stringify(obj));
}