js數組及對象的深拷貝


為了解除引用關系復制對象或者數組,如果是淺層的數組或對象(也就是數組中不包含對象或數組),可以通過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。

如此即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM