由於引用類型(數組、對象)是按地址傳遞,直接拷貝是淺拷貝,即修改拷貝後的變數,原變數也會改變。有時需要深拷貝一個對象,這時就需要遍歷徹底複製,使原對象和拷貝對象完全脫離關係。 代碼: 實現細節:假定傳入的是一個引用類型,首先判定傳入的是數組還是對象,根據判定結果,確定o是初始化為空數組還是空對象。之 ...
由於引用類型(數組、對象)是按地址傳遞,直接拷貝是淺拷貝,即修改拷貝後的變數,原變數也會改變。有時需要深拷貝一個對象,這時就需要遍歷徹底複製,使原對象和拷貝對象完全脫離關係。
代碼:
function deepCloneObj(obj){ var i; var o = Array.isArray(obj) ? [] : {}; for(i in obj){ if(obj.hasOwnProperty(i)){ o[i] = typeof obj[i] === "Object"? deepCloneObj(obj[i]) : obj[i]; } } return o; }
實現細節:假定傳入的是一個引用類型,首先判定傳入的是數組還是對象,根據判定結果,確定o是初始化為空數組還是空對象。之後遍歷傳入引用類型的自有屬性,並判定屬性是否為對象,如果是的話做遞歸,否則直接複製給o。
數組實例:
var arr1 = ["sfsag","akghak","['fafa','gaag','rwet']",125]; console.log(arr1);//["sfsag", "akghak", "['fafa','gaag','rwet']", 125] var arr2 = deepCloneObj(arr1); arr1.push("newstr"); console.log(arr1);//["sfsag", "akghak", "['fafa','gaag','rwet']", 125, "newstr"] console.log(arr2);//["sfsag", "akghak", "['fafa','gaag','rwet']", 125]
對象實例:
var obj1 = {sgsh:{sfwg:'ssgsg'},asga:['aff','ghh','wegwer',12],segg:1}; console.log(obj1);//Object {sgsh: Object, asga: Array[4], segg: 1} var obj2 = deepCloneObj(obj1); obj1['newstr'] = ['fsg','gsr']; console.log(obj1);//Object {sgsh: Object, asga: Array[4], segg: 1, newstr: Array[2]} console.log(obj2);//Object {sgsh: Object, asga: Array[4], segg: 1}