摘要:網上有很多方法,比如對象的和的等,但是它們有一個共同的問題就是對簡單對象可以實現深拷貝,但是對復雜對象就不行了,比如這樣一個對象屬性值有函數數組復雜對象等這個時候剛才那幾個方法就不行了。
以前對深拷貝和淺拷貝沒有太深的印象,后來才知道是因為沒掉進去過它的坑里。最近掉坑了才意識到它們的重要性。
閑話少敘,來說說坑:如果我需要保存一個復雜的對象 obj 并把它賦值給 originalObj ,后來對obj對象的某個屬性值進行了修改,然后,,,我保存的初始值originalObj 也被修改了?。。?br>這個時候明眼人應該看出問題來了:因為我給originalObj 賦值的時候用的是淺拷貝,所以修改obj 的屬性值的時候,originalObj 也跟著變了。這就是淺拷貝的直接表現。
那么 假如我想保存一份初始值originalObj ,不管 obj 怎么修改,都保持originalObj 始終不變,該怎么辦呢?答案就是用深拷貝。。。
網上有很多方法,比如Object.assign()、JSON對象的parse和stringify、JQ的extend等,但是它們有一個共同的問題就是對簡單對象可以實現深拷貝,但是對復雜對象就不行了,比如這樣一個對象(屬性值有函數、數組、復雜對象等):
這個時候剛才那幾個方法就不行了。那該怎么辦呢?
這個時候就需要自己寫一個函數了:
function copyFn(obj) { if (obj == null) { return null } var result = Array.isArray(obj) ? [] : {}; for (let key in obj) { if (obj.hasOwnProperty(key)) { if (typeof obj[key] === "object") { result[key] = copyFn(obj[key]); // 如果是對象,再次調用該方法自身 } else { result[key] = obj[key]; } } } 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 屬性
希望這個用函數實現復雜對象的深拷貝的方法對您有所幫助!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/102080.html
摘要:四是在年出的持久性數據結構的庫,持久性指的是數據一旦創建,就不能再被更改,任何修改或添加刪除操作都會返回一個新的對象。避免大量使用操作,這樣會浪費性能。盡量將設計成扁平狀的。 一、痛點 在我們的印象中,React 好像就意味著組件化、高性能,我們永遠只需要關心數據整體,兩次數據之間的 UI 如何變化,則完全交給 React Virtual Dom 的 Diff 算法 去做。以至于我們很...
摘要:舉例需要注意的是,此時回調函數中的指向的就是數組或者對象的某一項。中提供的拷貝方法,默認為淺拷貝,如果第一個參數為布爾值則表示深拷貝。 前言 平時開發過程中經常會用類似each、map、forEach之類的方法,Zepto本身也把這些方法掛載到$函數身上,作為靜態方法存在,既可以給Zepto的實例使用,也能給普通的js對象使用。今天我們主要針對其提供的這些api做一些源碼實現分析。 源...
摘要:舉例需要注意的是,此時回調函數中的指向的就是數組或者對象的某一項。中提供的拷貝方法,默認為淺拷貝,如果第一個參數為布爾值則表示深拷貝。 前言 平時開發過程中經常會用類似each、map、forEach之類的方法,Zepto本身也把這些方法掛載到$函數身上,作為靜態方法存在,既可以給Zepto的實例使用,也能給普通的js對象使用。今天我們主要針對其提供的這些api做一些源碼實現分析。 源...
閱讀 3337·2021-11-22 14:44
閱讀 2542·2019-08-30 14:10
閱讀 2601·2019-08-30 13:12
閱讀 1222·2019-08-29 18:36
閱讀 1345·2019-08-29 16:16
閱讀 3333·2019-08-26 10:33
閱讀 1766·2019-08-23 18:16
閱讀 383·2019-08-23 18:12