JavaScript深拷貝實現

2021-09-11 13:27:50 字數 1435 閱讀 4368

###什麼是淺拷貝,什麼是深拷貝? 什麼是淺拷貝 關於淺拷貝的概念,我在網上看到一種說法,直接上**。

1.var person = };

2.var person1 = person; //他們認為這是淺拷貝

複製**

但是我個人認為,上面這個根本不涉及拷貝,只是乙個簡單的引用賦值。以我的理解,淺拷貝應該是不考慮物件的引用型別的屬性,只對當前物件的所有成員進行拷貝,**如下:

function copy(obj);

for(var key in obj)

return objcopy;

}var person = };

var personcopy = copy(person);

複製**

上面這段**中,person物件擁有兩個基本型別的屬性name和age,乙個引用型別的屬性car,當使用如上方法進行拷貝的時候,name和age屬性會被正常的拷貝,但是car屬性,只會進行引用的拷貝,這樣會導致拷貝出來的物件personcopy和person會共用乙個car物件。這樣就是所謂的淺拷貝。 ###什麼是深拷貝 深拷貝的就是在拷貝的時候,需要將當前要拷貝的物件內的所有引用型別的屬性進行完整的拷貝,也就是說拷貝出來的物件和原物件之間沒有任何資料是共享的,所有的東西都是自己獨佔的乙份。 ###如何實現深拷貝 實現深拷貝需要考慮如下幾個因素:

var x =  },

c: [ 1, 2, 3 ]

};var y = $.extend({}, x), //shallow copy

z = $.extend(true, {}, x); //deep copy

y.b.f === x.b.f // true

z.b.f === x.b.f // false

複製**

但是jquery的這個$.extend()方法,有弊端,什麼弊端呢?我們看下面的例子:

var obja = {};

var objb = {};

obja.b = objb;

objb.a = obja;

$.extend(true,{},a);

//這個時候就出現異常了

//uncaught rangeerror: maximum call stack size exceeded(…)

複製**

也就是說,jquery中的$.extend()並沒有處理迴圈引用的問題。 ###使用json物件實現深拷貝 使用json全域性物件的parse和stringify方法來實現深複製也算是乙個簡單討巧的方法。

function jsonclone(obj) 

var clone = jsonclone();

複製**

JavaScript深拷貝 淺拷貝

淺拷貝 淺拷貝只是複製了記憶體位址,如果原位址中的物件改變了,淺拷貝出來的物件也會相應改變。深拷貝 開闢了一塊新的記憶體存放位址和位址指向的物件,原位址的任何物件改變了,深拷貝出來的物件不變。淺拷貝陣列 只拷貝第一級陣列 1.直接遍歷var arr 1,2,3,4 function copy arg...

javaScript淺拷貝 深拷貝

資料型別 js的資料型別有兩種 1.基本資料型別 數值 字串 布林 null undefined 值型別 存放在棧中,所以複製基本資料型別的值是會新開乙個棧記憶體 淺拷貝 如果我們要複製物件的所有屬性都不是引用型別時,就可以使用淺拷貝,實現方式就是遍歷並複製,最後返回新的物件。深拷貝 深度拷貝就是把...

javaScript淺拷貝 深拷貝

資料型別 js的資料型別有兩種 1.基本資料型別 數值 字串 布林 null undefined 值型別 存放在棧中,所以複製基本資料型別的值是會新開乙個棧記憶體 淺拷貝 如果我們要複製物件的所有屬性都不是引用型別時,就可以使用淺拷貝,實現方式就是遍歷並複製,最後返回新的物件。深拷貝 深度拷貝就是把...