1. 程式人生 > >js中淺復制跟深復制的簡單實現

js中淺復制跟深復制的簡單實現

ole cnblogs log down ret arguments 地址 沒有 nts

深復制是在堆中新開辟一塊內存地址用於存放復制的對象,新舊對象之間沒有影響。

淺復制僅僅是指向被復制的內存地址,如果原地址的對象被改變裏,那麽淺復制出來的對象也會隨之改變。

淺復制的實現

function shallowClone(obj) {
    var objClone = {};
    for (var i in obj) {
        objClone[i] = obj[i] 
    }
    return objClone;
}
var obj = {
    name: ‘a‘,
    say: function () {
        console.log(‘hi~‘);
    }
}

var cloneObj = shallowClone(obj);
console.log(cloneObj.name);
console.log(cloneObj.say());

深復制的實現

function deepClone(obj, objClone) {
    var tempObj = objClone || {};
    for(var i in obj) {
        var prop = obj[i];
      //避免相互引用的對象導致死循環的情況,則應該在遍歷的時候判斷是否相互引用對象,如果是則退出循環。
        if(prop === obj) {
            continue;
        }
        if(typeof obj[i] === ‘object‘) {
            tempObj[i] = (prop.constructor === Array) ? [] : {};
            arguments.callee(prop, tempObj[i]) ;
        } else {
            tempObj[i] = obj[i];
        }
    }
    return tempObj;
}
var obj1 = {};
var obj2 = { name: ‘a‘};
deepClone(obj2, obj1);
console.log(obj1.name);

js中淺復制跟深復制的簡單實現