為了解除引用關系復制對象或者數組,如果是淺層的數組或對象(也就是數組中不包含對象或數組),可以通過slice或者concat方法直接實現。
var arr1 = [1, 2, 3]; var arr2 = arr1.slice(0); arr1[0] = 0; console.log(arr1); console.log(arr2);
var arr3 = [1, 2, 3]; var arr4 = arr3.concat(); arr3[0] = 0; console.log(arr3); console.log(arr4);
也可以通過自己的方法實現,就是遍歷數組或對象,返回新數組或者對象。
var simpleCopy = function(o){ if (o instanceof Array) { var n = []; for (var i = 0; i < o.length; ++i) { n[i] = o[i]; } return n; } else if (o instanceof Object) { var n = {} for (var i in o) { n[i] = o[i]; } return n; } }
那么如何實現拷貝包含對象或者數組的這種情況呢?那么就通過遞歸拷貝來實現。
var deepCopy = function(o) { if (o instanceof Array) { var n = []; for (var i = 0; i < o.length; ++i) { n[i] = deepCopy(o[i]); } return n; } else if (o instanceof Object) { var n = {} for (var i in o) { n[i] = deepCopy(o[i]); } return n; } else { return o; } }
注意:代碼中我用instanceof來判斷類型,一定要把o instanceof Array 放在 o instanceof Object上面,因為如果是數組的話,instanceof Object也返回true。
如此即可。