js對象深拷貝

來源:互聯網
上載者:User

標籤:

由於參考型別(數組、對象)是按地址傳遞,直接拷貝是淺拷貝,即修改拷貝後的變數,原變數也會改變。有時需要深拷貝一個對象,這時就需要遍曆徹底複製,使原對象和拷貝對象完全脫離關係。

代碼:

    function deepCloneObj(obj){        var i;        var o = Array.isArray(obj) ? [] : {};        for(i in obj){            if(obj.hasOwnProperty(i)){                o[i] = typeof obj[i] === "Object"? deepCloneObj(obj[i]) : obj[i];            }        }        return o;    }

實現細節:假定傳入的是一個參考型別,首先判定傳入的是數組還是對象,根據判定結果,確定o是初始化為空白數組還是Null 物件。之後遍曆傳入參考型別的自有屬性,並判定屬性是否為對象,如果是的話做遞迴,否則直接複製給o。

數組執行個體:

    var arr1 = ["sfsag","akghak","[‘fafa‘,‘gaag‘,‘rwet‘]",125];    console.log(arr1);//["sfsag", "akghak", "[‘fafa‘,‘gaag‘,‘rwet‘]", 125]    var arr2 = deepCloneObj(arr1);    arr1.push("newstr");    console.log(arr1);//["sfsag", "akghak", "[‘fafa‘,‘gaag‘,‘rwet‘]", 125, "newstr"]    console.log(arr2);//["sfsag", "akghak", "[‘fafa‘,‘gaag‘,‘rwet‘]", 125]

對象執行個體:

    var obj1 = {sgsh:{sfwg:‘ssgsg‘},asga:[‘aff‘,‘ghh‘,‘wegwer‘,12],segg:1};    console.log(obj1);//Object {sgsh: Object, asga: Array[4], segg: 1}    var obj2 = deepCloneObj(obj1);    obj1[‘newstr‘] = [‘fsg‘,‘gsr‘];    console.log(obj1);//Object {sgsh: Object, asga: Array[4], segg: 1, newstr: Array[2]}    console.log(obj2);//Object {sgsh: Object, asga: Array[4], segg: 1}

 

js對象深拷貝

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.