JS:如何解决深拷贝循环引用的问题(*****五颗星)

1.如何解决深拷贝循环引用的问题?

解决方法思想:就是在函数中再找一个容器来存放对象的引用,如果遇到循环引用,会直接返回已经拷贝过的对象的引用容器,从而避免了循环引用导致的无限递归。方法有很多,用数组当容器或map或WeakMap等

在 JavaScript 中,深拷贝循环引用的问题可以通过以下方法解决:

  1. 使用第三方库,如 Lodash、Underscore、jQuery 等,它们都提供了深拷贝方法,可以解决循环引用问题。
  2. 手动实现深拷贝函数,使用一个 WeakMap 对象来记录已经拷贝过的对象引用。当遇到循环引用时,在 WeakMap中查找对应的已拷贝对象,如果存在,则直接返回该对象的引用,否则,继续拷贝。或者用数组,方式很多,

以下使用Weak Map来解决深拷贝循环拷贝问题:

<script>
    function deepClone(obj, map = new WeakMap()) {
      let ctor,
        isArray = Array.isArray(obj),
        isObject = Object.prototype.toString.call(obj).slice(8, -1) === "Object" ? true : false
      if (obj == null) return obj
      ctor = obj.constructor
      if (/^(regexp|date)$/i.test(ctor)) return new ctor(obj)
      if (/^(error)$/i.test(ctor)) return new ctor(obj.message)
      // 或者如下方式判断regexp/error/date
      // if (obj instanceof RegExp||obj instanceof Date) return new ctor(obj)
      // if (obj instanceof Error) return new ctor(obj.message)
      if (typeof obj === "function") return function proxy(...args) {
        return obj.call(this, ...

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

前端面试题 文章被收录于专栏

前端面试的一些常问问题、问题的具体实现(可直接运行)以及底层原理

全部评论

相关推荐

qq乃乃好喝到咩噗茶:院校后面加上211标签,放大加粗,招呼语也写上211
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务