談談淺拷貝和深拷貝的區別,以及實現的方法

2021-08-17 09:41:50 字數 3095 閱讀 2943

兩者的區別:乙個物件淺複製後,是深層次的物件位址的複製,並沒有開闢新的棧,也就是複製的結果是兩個物件指向同乙個位址,修改其中乙個物件的屬性,則另乙個物件的屬性也會發生改變,而深複製的則是開闢了乙個新的棧,兩個物件對應兩個不同的位址,修改乙個物件的屬性,不會改變另乙個物件的屬性。

話不多說,上**:

// 原始物件

var obj = ,

obj1:,

obj3:

} }};// 開始淺複製

var shallowobj = shallowcopy(obj);

// 定義淺複製邏輯

function shallowcopy(src) ;

for (var prop in src)

} return dst;

}// 改變複製後的新物件屬性值(第一層屬性)

shallowobj.a = 2;

shallowobj.arr = [9,8];

shallowobj.say = function()

// 列印新物件的及方法

console.dir(shallowobj)    

shallowobj.say();  // world

// 列印原物件及方法

console.dir(obj);

obj.say();  // hello

結果如圖所示:

結論 : 修改新物件的屬性值,第一層的屬性值的確沒有變化,重點來了,我們給第二層以及更深層次的屬性複製試試

// 原始物件

var obj = ,

obj1:,

obj3:

} }};// 開始淺複製

var shallowobj = shallowcopy(obj);

// 定義淺複製邏輯

function shallowcopy(src) ;

for (var prop in src)

} return dst;

}// 改變複製後的新物件的屬性值(第二層以及更深層次)

shallowobj.obj1.obj3.take = function()

shallowobj.obj1.hand = function()

// 列印新物件的方法呼叫

shallowobj.obj1.obj3.take();  // shallowobj_take

shallowobj.obj1.hand();      // shallowobj_hand

// 列印原物件的方法呼叫

obj.obj1.obj3.take();   // shallowobj_take

obj.obj1.hand();     // shallowobj_hand

問題出現了:原物件的方法被新物件的修改,而產生變化。

原因是複製的是物件的位址指標,兩個屬性共同指向乙個物件,只要其一發生變化,另乙個也隨之變化

深拷貝的方法:

1.可以遞迴遞迴去複製所有層級屬性

// 原始物件

var obj = ,

obj1:,

obj3:

} }};// 深複製邏輯(遞迴呼叫)

function deepclone(obj);

if(obj && typeof obj==="object")else}}

}return objclone;

}    

// 開始深複製

var shallowobj = deepclone(obj);

// 改變複製後的新物件的屬性值(第二層以及更深層次)

shallowobj.obj1.obj3.take = function()

shallowobj.obj1.hand = function()

shallowobj.obj1.obj3.take();  // shallowobj_take

shallowobj.obj1.hand();      // shallowobj_hand

obj.obj1.obj3.take();   // take

obj.obj1.hand();     // hand

結論:深拷貝後改變物件的屬性值,不會影響原始物件的值。

2.除了遞迴,我們還可以借用json物件的parse和stringify

function deepclone(obj)    

let a=[0,1,[2,3],4],

b=deepclone(a);

a[0]=1;

a[2][0]=1;

console.log(a,b);

3.除了上面兩種方法之外,我們還可以借用jq的extend方法$.extend( [deep ], target, object1 [, objectn ] )

deep表示是否深拷貝,為true為深拷貝,為false,則為淺拷貝

target

object型別 目標物件,其他物件的成員屬性將被附加到該物件上。

object1  objectn

可選。 object型別 第乙個以及第n個被合併的物件。

let a=[0,1,[2,3],4],

b=$.extend(true,,a);

a[0]=1;

a[2][0]=1;

console.log(a,b);

談談深拷貝和淺拷貝

今天在做專案購物車需求的時候,遇到乙個同深拷貝 淺拷貝相關的問題,所以來談談深拷貝和淺拷貝。什麼是深拷貝?複製基本型別的屬性 引用型別的屬性複製,複製棧中的變數 和 變數指向堆記憶體中的物件的指標和堆記憶體中的物件。什麼是淺拷貝?複製基本型別的屬性 引用型別的屬性複製,複製棧中的變數 和 變數指向堆...

js 深拷貝和淺拷貝區別,以及實現深拷貝的方法

定義 1.深拷貝 function deepcopy obj var obj say console.log deepcopy obj 注意 這種拷貝方法不可以拷貝一些特殊的屬性 例如正規表示式,undefine,function function deepcopytwo obj if obj ty...

深拷貝和淺拷貝的區別

retain屬性表示兩個物件位址相同 建立乙個指標,指標拷貝 內容當然相同,這個物件的retain值 1也就是說,retain 是指標拷貝 淺拷貝 copy 是內容拷貝 深拷貝 ios中並不是所有的物件都支援copy,mutablecopy,遵守nscopying 協議的類可以傳送copy訊息,遵守...