// 깊은 복사(Deep Clone) 테스트
    var obj0 = {
    string: 'string',
    number: 123,
    bool: false,
    nul: null,
    date: new Date(),  // stringified
    undef: undefined,  // lost
    inf: Infinity,  // forced to 'null'
    re: /.*/,  // lost
    }
    var obj = {a: "a",  num: 1 , arr: [1, 2, 3], obj2: {obj0, aa: 'aa', str: "whazzup", obj3: {aaa: 'aaa', str: "whazzup"} } };
    var ret = [];

//기본(얕은) 복사
    ret[0] = {...obj};

    // 자바스크립트 JSON 함수 
    ret[1] = JSON.parse(JSON.stringify(obj)); // 비추! 여러 자료형을 그대로 복제 못함

    // ES6  Object.assign 
    ret[2] = Object.assign({}, obj);// 불완전 복사

    // lodash (2번째 빠름)
    ret[3] = _.clone(obj, true);// 불완전 복사
    ret[4] = _.cloneDeep(obj);// 완전 복사 <====== 추천

    // jQuery extend 함수
    ret[5] = $.extend(true, {}, obj);// 완전 복사

    ret[6] = clone( obj);// ConroyP

    //=============
    obj.num = 99;
    obj.obj2.obj0.number = 999;
    obj.obj2.obj3.aaa = 'zzz';
    console.log('org change to ',  obj.num, obj.obj2.obj0.number, obj.obj2.obj3.aaa);
    ret.some( (val, index) =>{
        console.log(index,  val.num, val.obj2.obj0.date, val.obj2.obj0.number, val.obj2.obj3.aaa);
    });


//==============
//https://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-deep-clone-an-object-in-javascript/13333781#13333781
function clone(obj) {
    if (obj === null || typeof (obj) !== 'object' || 'isActiveClone' in obj)
        return obj;

    if (obj instanceof Date)
        var temp = new obj.constructor(); //or new Date(obj);
    else
        var temp = obj.constructor();

    for (var key in obj) {
        if (Object.prototype.hasOwnProperty.call(obj, key)) {
            obj['isActiveClone'] = null;
            temp[key] = clone(obj[key]);
            delete obj['isActiveClone'];
        }
    }
    return temp;
}

 

//==========

//참고

https://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-deep-clone-an-object-in-javascript 

https://frontbackend.com/javascript/what-is-the-the-fastest-way-to-deep-clone-an-object-in-javascript 

Posted by 코덴스

댓글을 달아 주세요