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%内容,订阅专栏后可继续查看/也可单篇购买
前端面试题 文章被收录于专栏
前端面试的一些常问问题、问题的具体实现(可直接运行)以及底层原理
腾讯云智研发成长空间 254人发布

