天天看點

借jQuery對象拷貝學習深拷貝與淺拷貝

jQuery.extend([deep], target, object1, [objectN]) 即用一個或多個其他對象來擴充一個對象,傳回被擴充的對象。

deep:如果設為true,則遞歸合并。

target:待修改對象。

object1:待合并到第一個對象的對象。

objectN:待合并到第一個對象的對象。

其中[deep]可選,深/淺拷貝,true:深拷貝 false:淺拷貝(預設)

淺拷貝與深拷貝差別:

var targetObj = {
    id: 0,
    msg: {
        sex: '男'
        }
    }
var obj = {
    id: 1,
    name: 'andy',
    msg: {
    age: 18
        }
    }              
借jQuery對象拷貝學習深拷貝與淺拷貝

在上面targetObj與obj兩個對象中,存在id,name兩個簡單資料類型和msg這個複雜資料類型。

1.淺拷貝 把原來對象裡面的複雜資料類型位址拷貝給目标對象

在進行淺拷貝時,對于簡單資料類型的如果不存在相同的屬性名則将屬性名與屬性值進行精确拷貝,若已存在屬性名則會将屬性值進行拷貝(覆寫)給待修改對象。

對于複雜資料類型,會将其位址拷貝給目标對象

比如,淺拷貝後如果對目标對象的複雜資料類型進行修改,則就是對該記憶體位址進行修改,把變量在棧空間儲存的堆位址複制給了形參,則目标對象與被拷貝對象都會進行修改

$.extend(true, targetObj, obj)
targetObj.msg.age = 20;
console.log(targetObj);
console.log(obj);      

淺拷貝後,并對複雜資料類型進行修改:

2.深拷貝 把裡面的資料完全複制一份給目标對象 , 如果裡面有不沖突的屬性,會合并到一起

$.extend(true, targetObj, obj) //會覆寫targetObj裡面原來的資料 
targetObj.msg.age = 20;
console.log(targetObj);
console.log(obj);      
借jQuery對象拷貝學習深拷貝與淺拷貝
借jQuery對象拷貝學習深拷貝與淺拷貝

自己了解的一個總結,不足之處歡迎指出,感謝

繼續閱讀