使用WeakMap追踪已访问对象可有效实现支持循环引用的深拷贝。该方法在递归前检查对象是否已处理,避免无限循环,同时兼容Date、RegExp、Set、Map等特殊类型,确保正确复制各类数据且防止内存泄漏。

实现一个能处理循环引用的深拷贝函数,关键在于追踪已访问的对象,避免无限递归。以下是构建该函数的核心思路和有效方法。
在遍历对象属性进行拷贝时,如果遇到对象或数组,先检查是否已在拷贝过程中处理过。若已存在,则直接返回对应的拷贝结果,从而打破循环。
WeakMap 是理想选择,因为它允许以对象为键,且不会阻止垃圾回收,避免内存泄漏。
说明:除了普通对象和数组,深拷贝还需考虑特殊类型,如 Date、RegExp、Set、Map 等。
建议:以下是一个简化但有效的实现:
<strong>function deepClone(obj, hash = new WeakMap()) {
if (obj == null || typeof obj !== 'object') return obj;
if (hash.has(obj)) return hash.get(obj);
let result;
if (obj instanceof Date) {
result = new Date(obj);
} else if (obj instanceof RegExp) {
result = new RegExp(obj.source, obj.flags);
} else if (obj instanceof Set) {
result = new Set();
hash.set(obj, result);
for (let val of obj) {
result.add(deepClone(val, hash));
}
} else if (obj instanceof Map) {
result = new Map();
hash.set(obj, result);
for (let [key, val] of obj) {
result.set(deepClone(key, hash), deepClone(val, hash));
}
} else {
result = Array.isArray(obj) ? [] : {};
hash.set(obj, result);
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
result[key] = deepClone(obj[key], hash);
}
}
}
return result;
}</strong>基本上就这些。只要用 WeakMap 缓存中间状态,就能安全处理循环引用,同时兼顾常用类型的支持。不复杂但容易忽略细节。
以上就是如何实现深拷贝函数_处理循环引用的有效方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号