編寫一個對象&&數組深copy函數方法

介紹

什麼是深copy?意思就是指源對象與拷貝對象互相獨立,其中任何一個對象的改動都不會對另一個對象形成影響。舉個例子,一我的名叫張三,後來用他克隆(假設法律容許)了另一我的,叫李四,無論是張三之後缺胳膊少腿仍是李四之後掛掉了,都不會影響另一我的。數組

在js中,深copy一個對象,不論源對象或者拷貝對象改變,都不會對對象形成影響,舉個js的栗子:函數

//咱們定義了一個張三,而後又用deepCopy基於張三深拷貝了一個名字爲李四的人。
var people1 = {name: '張三', age: 20, die: false, hobbies: ['旅遊', '打籃球']};
var people2 = deepCopy(people1);
people2.name = '李四';

//打印people1和people2的name
console.log('people1:', people1.name, 'people2:', people2.name); //people1: 張三 people2: 李四

//咱們再修改people2的興趣愛好(hobbies)
people2.hobbies[1] = '看書';
console.log('李四的愛好是:', people2.hobbies); //李四的愛好是:["旅遊", "看書"]
console.log('張三的愛好是:', people1.hobbies); //張三的愛好是:["旅遊", "打籃球"]
複製代碼

從上面的代碼運行過程和結果咱們看到,用深拷貝方法拷貝的新對象和源對象是互相不影響的。ui

目的

編寫一個可以深copy數組和對象的js函數方法spa

代碼

function deepCopy(obj) {
    var newObj;
    if(typeof obj === 'object'){
        newObj = obj.constructor === Array ? [] : {};
        for(var key in obj){
            if(typeof obj[key] === 'object'){
                newObj[key] = deepCopy(obj[key]);
            }else{
                newObj[key] = obj[key];
            }
        }
    }else{
        newObj = obj;
    }
    return newObj;
}
複製代碼

講解

上面代碼中deepCopy函數的實現過程當中,能夠看到用到了函數遞歸。這裏用函數遞歸是爲了解決對象中的屬性爲數組或者對象時,深層拷貝的數組||對象屬性。還有一個判斷數組和對象的方法,我這裏用的是 obj.constructor === Array ? [] : {},由於數組也屬於對象,因此用typeof沒法區分數組和對象。固然還有不少種其餘的區分數組和對象的方法了,你們能夠在編寫本身的deepCopy方法的時候使用。code

說下淺複製和深複製的區別:

淺複製:只會將對象的各個屬性進行依次複製,並不會進行遞歸複製,而js存儲對象都是存地址的,因此淺複製會致使源對象的對象||數組屬性和拷貝對象的對象||數組屬性 指向同一塊內存地址;會致使引用。對象

深複製:它不只將原對象的各個屬性逐個複製出去,並且將原對象各個屬性所包含的對象也依次採用深複製的方法遞歸複製到新對象上。這就不會存在屬性指向同一個對象||數組的問題。遞歸

相關文章
相關標籤/搜索