以前對深拷貝和淺拷貝沒有太深的印象,後來才知道是因為沒掉進去過它的坑里。最近掉坑了才意識到它們的重要性。
閒話少敘,來說說坑:如果我需要儲存乙個複雜的物件 obj 並把它賦值給 originalobj ,後來對obj物件的某個屬性值進行了修改,然後,,,我儲存的初始值originalobj 也被修改了!!!
這個時候明眼人應該看出問題來了:因為我給originalobj 賦值的時候用的是淺拷貝,所以修改obj 的屬性值的時候,originalobj 也跟著變了。這就是淺拷貝的直接表現。
那麼 假如我想儲存乙份初始值originalobj ,不管 obj 怎麼修改,都保持originalobj 始終不變,該怎麼辦呢?答案就是用深拷貝。。。
網上有很多方法,比如object.assign()、json物件的parse和stringify、jq的extend等,但是它們有乙個共同的問題就是對簡單物件可以實現深拷貝,但是對複雜物件就不行了,比如這樣乙個物件(屬性值有函式、陣列、複雜物件等):
這個時候剛才那幾個方法就不行了。那該怎麼辦呢?
這個時候就需要自己寫乙個函式了:
function copyfn(obj)
var result = array.isarray(obj) ? : {};
for (let key in obj) else
} }
return result;
}
然後 copy 物件的效果如下:
let obj_2 = deepcopy(obj_1);
console.log(obj_1); // 修改name屬性之前,列印出來 name 也是 edited
obj_1.name = 'edited';
console.log(obj_1); // 修改name屬性之後,列印出來 name 是 edited
console.log(obj_2); // 由於是深拷貝,修改obj_1 的 name屬性之前,不影響 obj_2 的 name 屬性
希望這個用函式實現複雜物件的深拷貝的方法對您有所幫助!
原生JS 實現複雜物件深拷貝(物件值包含函式)
以前對深拷貝和淺拷貝沒有太深的印象,後來才知道是因為沒掉進去過它的坑里。最近掉坑了才意識到它們的重要性。閒話少敘,來說說坑 如果我需要儲存乙個複雜的物件 obj 並把它賦值給 originalobj 後來對obj物件的某個屬性值進行了修改,然後,我儲存的初始值originalobj 也被修改了!這個...
js物件深拷貝
由於引用型別 陣列 物件 是按位址傳遞,直接拷貝是淺拷貝,即修改拷貝後的變數,原變數也會改變。有時需要深拷貝乙個物件,這時就需要遍歷徹底複製,使原物件和拷貝物件完全脫離關係。function deepcloneobj obj for i in obj return o 實現細節 假定傳入的是乙個引用...
原生js實現物件的深拷貝及迴圈引用
我們使用object.assign target,sources 時,其實只是淺拷貝。只能複製第一層屬性,而如果第一層屬性中有物件或陣列的話,其實只是對物件或陣列的引用而已。我們修改target裡的物件屬性時,source物件中對應的物件屬性也會改變 let source let target ob...