JS:如何解决深拷贝循环引用的问题(*****五颗星)
1.如何解决深拷贝循环引用的问题?
解决方法思想:就是在函数中再找一个容器来存放对象的引用,如果遇到循环引用,会直接返回已经拷贝过的对象的引用容器,从而避免了循环引用导致的无限递归。方法有很多,用数组当容器或map或WeakMap等
在 JavaScript 中,深拷贝循环引用的问题可以通过以下方法解决:
- 使用第三方库,如 Lodash、Underscore、jQuery 等,它们都提供了深拷贝方法,可以解决循环引用问题。
- 手动实现深拷贝函数,使用一个 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%内容,订阅专栏后可继续查看/也可单篇购买
前端面试题 文章被收录于专栏
前端面试的一些常问问题、问题的具体实现(可直接运行)以及底层原理