1. 程式人生 > >學習筆記--深度克隆

學習筆記--深度克隆

//物件的深拷貝,不考慮包含函式
var obj1={
    num:10,
    str:'yans',
    arr:[1,2,3],
    obj:{
        num:11,
        str:'chengy',
        arr:[4,5,6],
        obj:{
            num:12,
            judge:true
        }
    }
};
var obj2={};
function deepClone(obj1,obj2) {//修改一個物件,另一個物件不受影響
    for(var prop in obj1){//遍歷物件1
        if(obj1.hasOwnProperty(prop)){ //判斷是否是obj1擁有的(不包含繼承的)
            /*
                    typeof的返回值有6種
                    number,boolean(true,false),string,undefined,object(物件,陣列和null),function
            */
            if(obj1[prop]!=="null"&&typeof(obj1[prop])=='object'){//引用型別
                /*
                    區分物件和陣列有三種方式: a=[],b={}
                    Object.prototype.toString.call(a)---->'[object Array]'
                    Object.prototype.toString.call(b)---->'[object Object]'
                    a instanceof Array---->true   a instanceof Object---->true
                    b instanceof Array---->false  b instanceof Object---->true
                    a.constructor==Array---->true   a.constructor==Object---->false
                    b.constructor==Array---->false  b.constructor==Object---->true
                */
                if(Object.prototype.toString.call(obj1[prop])=='[object Array]')
                    obj2[prop]=[];
                else
                    obj2[prop]={};
                deepClone(obj1[prop],obj2[prop]);
            }
            else{//值型別
                obj2[prop]=obj1[prop];
            }
        }
    }
}
deepClone(obj1,obj2);