javascript - 当两个对象相互引用时,如何停止无限递归?
问题描述
假设我想制作一个对象的深层副本。我使用递归来遍历它的属性。现在这些属性之一可以是一个对象。例如:
Person A
Name: "Fred"
Best Friend: Person B
现在如果人 B 是:
Person B
Name: "Max"
Best Friend: Person A
这将创建一个无休止的递归。我怎样才能避免这种无休止的循环?
解决方案
您可以使用与JSON.stringify相同的逻辑来避免无限循环。
- 如果 state.[[Stack]] 包含 value,则抛出 TypeError 异常,因为该结构是循环的。
它保留一堆正在序列化的父对象。每次调用序列化新值的方法时,都会检查堆栈以查看该值是否已经在序列化过程中,如果是,则抛出错误。
对于您的示例,如果您要制作“人 A”的副本,则在考虑如何复制“最好的朋友”属性时,父堆栈将是 [人 A]。更深入地讲,当序列化 Person B 的“Best Friend”属性时,父堆栈将是 [Person A, Person B]。看到下一个要序列化的项目,人 B 的“Best Friend”值,人 A,已经在堆栈中,抛出错误。
推荐阅读
- css - 为什么自动调整或自动填充不能与 minmax 一起正常工作?
- java - 通过多部分文件上传处理动态密钥
- python - OSError:errno 22,无效参数;尝试使用 to_json 时
- python - 将 pandas 列转换为用户定义的周数
- typescript - 特定模块的热模块替换只工作一次,而应用程序组件可以一直 HMR-ed
- c# - 多个 where 条件与 like and OR (not AND)
- php - WP_Query 用于目录
- python - 使用 pip v18.0 安装 Pillow (v5.2.0) 后没有名为 PIL 的模块
- excel - 在其中包含公式的两个工作簿之间复制工作表
- wordpress - WordPress 没有禁用自动断字