###什麼是淺拷貝,什麼是深拷貝? 什麼是淺拷貝 關於淺拷貝的概念,我在網上看到一種說法,直接上**。
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 值型別 存放在棧中,所以複製基本資料型別的值是會新開乙個棧記憶體 淺拷貝 如果我們要複製物件的所有屬性都不是引用型別時,就可以使用淺拷貝,實現方式就是遍歷並複製,最後返回新的物件。深拷貝 深度拷貝就是把...