淺拷貝和深拷貝

var obj={a:1,b:2,c:{d:1,e:[3,4,5]}};
淺拷貝:複製的是對象的引用,而不是對象本身,新舊對象還是共享一塊內存
方法一:for in

function shadowCopy(obj) {
    var result = {};
    for (var i in obj) {
        result[i] = obj[i];
    }
    return result;
}
var result = shadowCopy(obj);
result.c.d = 2;
obj.c.d = 2


方法二:Object.assign

var result = Object.assign({}, obj);
result.c.d = 2;
obj.c.d

深拷貝:創造一個一模一樣的對象,新對象與舊對象不共享內存,修改新對象不會改到原對象
方法一:轉換爲JSON字符串後再轉換爲JSON對象,缺點:針對函數不能區分類型,故普通對象建議採用此種方式

var result = JSON.parse(JSON.stringify(obj));
result.c.d = 2;
obj.c.d


方法二:遞歸

var deepCopy = (function f(obj) {
    var result = Array.isArray(obj) ? [] : {};
    for (var i in obj) {
        if (typeof obj[i] === "object") {
            result[i] = f(obj[i]);
        } else {
            result[i] = obj[i];
        }
    }
    return result;
});
var result = deepCopy(obj);
result.c.d = 2;
obj.c.d

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章