淺復制
淺復制就是,直接把一個對象(源對象)的屬性復制到另一個對象(目標對象)中,當然,如果當屬性中包含引用類型的,復制的也僅僅是引用地址,復制后的兩個對象共享同一對象和函數。
var obj = {
a:1,
b:function(){
console.log(this.a);
},
c:[10,11,12]
};
function slightCopy(targetO, sourceO){
for(var k in sourceO){
if(!targetO[k]){ //當目標對象中有重名的屬性則不需要復制,視情況添加
targetO[k] = sourceO[k]
}
}
return targetO;
}
var o = slightCopy({}, obj);
console.log(o);
深復制
為了解決淺復制的問題,于是有了深復制,可以復制一個一模一樣的對象并且不受彼此干擾。
function deepCopy(targetO, sourceO){
targetO = targetO || {};
for(var k in sourceO){
if(typeof sourceO[k] == "object"){
targetO[k] = Array.isArray(sourceO[k])? []: {}; // 判斷是否為數組
deepCopy(targetO[k], sourceO[k]);
}else{
targetO[k] = sourceO[k];
}
}
}
但是這個方法里用來Array.isArray,這個方法存在兼容問題,所以在使用的時候最好處理下兼容,這個在我之前的文章提到過處理方法:
if(typeof Array.isArray != "function") {
Array.isArray = function(obj){
return Object.prototype.toString.call(obj) == "[object Array]";
}
}