深拷贝(未考虑循环引用)

//深拷贝方法
function deepCopy(source) {
    //判断当前传参是引用类型还是基本类型
    //基本类型直接返回
    if(typeof source != 'object'){
        return source
    }
    //引用类型按情况处理
    let type = Object.prototype.toString.call(source).slice(8,-1);
    switch (type) {
        case 'Null':
            return source;
        case 'Date':
            return new Date(source);
        case 'Function':
            return source;
        case 'Array':
            return copyArray(source);
        case 'Object':
            return copyObject(source);
        default:
            return source
    }
}
//处理Array类型深拷贝
function copyArray(source) {
    let list = new Array();
    for(let item of source){
        list.push(deepCopy(item));
    }
    return list;
}
//处理Object类型深拷贝
function copyObject(source) {
    let obj = new Object();
    for(let key in source){
        if(source.hasOwnProperty(key)){
            //处理对象本身的属性
            //只处理当前一层
            obj[key] = deepCopy(source[key]);
        }
    }
    return obj;
}

const sourceObj = {
    name : 'test',
    value : 10,
    able : true,
    num : null,
    text : undefined,
    obj : {
        a : 1,
        b : '2',
        c : {
            d : 3,
            f : [1, 2, 3, 4, 5]
        }
    },
    list : [ 1, '2', null, undefined, {g:1,h:'XX'} ],
    fun : function () {return 4},
    date : new Date()
};
const targetObj = deepCopy(sourceObj);
targetObj.list[4].h = 'PP';
targetObj.obj.c.f[1] = 6;
targetObj.fun = function(){return 5};
console.log(targetObj);
console.log(targetObj.list[4].h);
console.log(sourceObj.list[4].h);
console.log(targetObj.obj.c.f);
console.log(sourceObj.obj.c.f);
console.log(targetObj.fun())
console.log(sourceObj.fun())
posted @ 2021-12-02 14:45  HaSaki_Wang  阅读(41)  评论(0)    收藏  举报