天天看点

原生js实现深拷贝【原创】

为什么我开始写博客了呢?因为今天有个场景下我需要实现这个功能,没有网络的情况下手写。逻辑写出来了,但是代码冗余量很大,其次呢,我发现好多博客写的确多多少少有点问题,所以我就扯出来这么一篇博客了

为什么需要深拷贝

因为对象直接复制给另外一个变量时,2个变量的值指向堆栈中同一条数据,改变其中一个变量中某个key的value,都会影响到另外一个变量的值

数据类型

很多博客直接就typeof判断数据类型了,时间new Data(),那也是返回的‘object’的,还有些用变量的构造函数初始化需要赋值的变量数据类型,实在是有些大才小用了

曾经看书,javascript高级程序设计中提到判断变量的数据类型,一下给出源码

const judgeDataType = function(n,type){
    return Object.prototype.toString.call(n)===type;
}

           

使用递归

写这个函数本有点问题一直把result的初始化放在了if中,实在是有点服我自己的,导致我想了会儿为什么返回的数据不对

const deepCopy = function(n){
    let result;
    const flag1 = judgeDataType(n,'[object Array]');
    if( flag1 ||judgeDataType(n,'[object Object]')){
        result = flag1?[]:{};
        for(let key in n){
            result[key] = deepCopy(n[key])
        }
    }else{
        result = n;
    }
    return result;
}

           

测试数据

以下为测试数据,欢迎来提bug

let num = {
    a:1,
    arr:[1,2,3,[4,5],{flag:false}],
    obj:{
        objChild:{
            n:undefined,
            d:new Date(),
            e:'sssss'
        }
    },
    fn:function(n){
        ++n
        console.log(1)
    }
}

           

ps:后续我会坚持写博客,一直想分享一个原生js实现的断点续传组件,若有需要可以评论中留言。

转载请注明出处,谢谢!

继续阅读