淺拷貝和深拷貝

淺拷貝和深拷貝都是只針對Object,Array這樣的復(fù)雜對象。淺拷貝只復(fù)制一層對象的屬性,而深拷貝則是遞歸復(fù)制了所有層級。

淺拷貝的實(shí)現(xiàn):

var obj = { a: 1, arr: [2, 3]};

var shallowObj = shallowCopy(obj);

function shallowCopy(obj){

??? var dist = {};

??? for(var prop in obj){

??????? if(obj.hasOwnProperty(prop)){

? ? ? ? ? ? dist[prop] = obj[prop];

??????? }

??? }

??? return dist;

}

由于js存儲對象都是存儲地址,所以淺拷貝會(huì)導(dǎo)致復(fù)制出的新對象和原對象指向同一塊內(nèi)存地址。若改變一個(gè)值,會(huì)導(dǎo)致另一個(gè)對象同時(shí)變化。

深拷貝則不同,不僅將原對象的各個(gè)屬性逐個(gè)復(fù)制出去,而且將原對象各個(gè)屬性包含的對象也以遞歸方式依次復(fù)制到新對象中,重新開辟一個(gè)空間存儲新對象。

深拷貝的實(shí)現(xiàn):

function deepClone(obj){

??? var newObj = obj.constructor === Array ? [] : {}

??? if(typeof obj !== 'Object'){

??????? return

??? }else if( window.JSON){

??????? newObj = JSON.parse(JSON.stringify(obj));

??? } else {

??????? for (var i in obj){

??????????? newObj[i] = typeof obj[i] === 'Object' ? deepClone(obj[i]) : obj[i];

??????? }

??? }

??? return newObj;

}

另外,jq也提供了拷貝的方法——extend

JQuery.extend(true,obj);

第一個(gè)參數(shù)是布爾值,用來設(shè)置是否進(jìn)行深拷貝。

還有一種可以實(shí)現(xiàn)深拷貝:JSON.parse(JSON.stringify(obj))。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • title: 原生js對象的淺拷貝和深拷貝的總結(jié) 這里是說明. 在此之前我們先復(fù)習(xí)兩個(gè)知識點(diǎn). 第一個(gè)知識點(diǎn):對象...
    KingJeason閱讀 931評論 1 8
  • 函數(shù)中傳遞的參數(shù),可以在函數(shù)內(nèi)部通過 arguments 這個(gè)類數(shù)組對象進(jìn)行訪問。 1.基本類型拷貝時(shí):以傳遞字符...
    Hunter_Gu閱讀 1,542評論 0 1
  • 在 JavaScript 中,對于Object和Array這類引用類型值,當(dāng)從一個(gè)變量向另一個(gè)變量復(fù)制引用類型值時(shí)...
    杰哥長得帥閱讀 120評論 0 0
  • 1、javaScript的變量類型 (1)基本類型:5種基本數(shù)據(jù)類型Undefined、Null、Boolean、...
    wengjq閱讀 871評論 0 15
  • @所有人!歡迎各位,正在建群中,請保持沉默…多謝!相關(guān)通知明早會(huì)陸續(xù)滾動(dòng)發(fā)放,注意看群信息就好。 各位早上好,我們...
    美玉空間閱讀 213評論 0 0

友情鏈接更多精彩內(nèi)容