js中如何实现this的深拷贝?

如果使用for循环深度遍历,会导致死循环;
或许可以使用 loadsh库的deepclone来实现,还有什么方式吗,原因是什么?

阅读 4.7k
5 个回答

生产中可以使用: circular-json 库来实现,避免JSON.stringify, JSON.parse处理循环报错的问题;
实现原理是:转成序列化后,循环引用的对象使用一个特殊的字符器标记来代替,parse的过程再把标记转成要引用的那个对象(this)

死循环是递归写得有问题。
深拷贝如果只是拷贝一些数组json数据,简单粗暴用:JSON.parse(JSON.stringify('xxxxxxx'))

死循环一般是copy过程中对象出现了循环引用自己。可以在递归过程中加个map存储copy过程中的对象,来应对可能出现的循环引用自己的情况。

不要滥用深拷贝,this也不应该被拷贝,需要拷贝的仅仅是部分数据,只深拷贝白名单中的部分数据就行。

deepCopy (obj) {
        var newobj = obj.constructor === Array ? [] : {};
        if(typeof obj !== 'object'){
            return;
        }
        for(var i in obj){
        newobj[i] = typeof obj[i] === 'object' ? utils.deepCopy(obj[i]) : obj[i];
        }
        return newobj
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题