之前對深拷貝和淺拷貝沒有太深的印象,後來才知道是由於沒掉進去過它的坑裏。最近掉坑了才意識到它們的重要性。數組
閒話少敘,來講說坑:若是我須要保存一個複雜的對象 obj 並把它賦值給 originalObj ,後來對obj對象的某個屬性值進行了修改,而後,,,我保存的初始值originalObj 也被修改了!!!
這個時候明眼人應該看出問題來了:由於我給originalObj 賦值的時候用的是淺拷貝,因此修改obj 的屬性值的時候,originalObj 也跟着變了。這就是淺拷貝的直接表現。
那麼 假如我想保存一份初始值originalObj ,無論 obj 怎麼修改,都保持originalObj 始終不變,該怎麼辦呢?答案就是用深拷貝。。。
網上有不少方法,好比Object.assign()、JSON對象的parse和stringify、JQ的extend等,可是它們有一個共同的問題就是對簡單對象能夠實現深拷貝,可是對複雜對象就不行了,好比這樣一個對象(屬性值有函數、數組、複雜對象等):函數
這個時候剛纔那幾個方法就不行了。那該怎麼辦呢?
這個時候就須要本身寫一個函數了:spa
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 對象的效果以下:code
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 屬性
但願這個用函數實現複雜對象的深拷貝的方法對您有所幫助!對象