Node.js输出<ref *1>含义及BinarySearchTree循环引用问题如何解决
问题解答
1. <ref *1>标识的含义
这个是Node.js控制台输出对象时的循环引用标记机制:
- Node.js打印嵌套对象时,为了避免循环引用导致无限递归输出、控制台卡死,会给每个出现过的对象分配唯一的引用ID,用
<ref *ID>的形式标记在对象第一次出现的位置 - 后续如果同一个对象被其他属性引用,就会用
[Circular *ID]指代,说明这个位置的属性指向的就是前面ID对应标记的对象,形成了循环引用
你输出里的<ref *1> BinarySearchTree { tree: [Circular *1] }就说明:这个BinarySearchTree实例被标记为引用1,它的tree属性又指向了它自己,形成了循环。
2. 出现该问题的原因
你的代码逻辑存在传参错误,导致意外生成了循环引用:
- 你封装的
addNode方法设计初衷是接收**树节点对象(带number属性的普通对象)**作为根节点,给它添加子节点后返回该根节点 - 但你在
insert方法中调用addNode时,第一个参数传的是this(也就是BinarySearchTree类的实例),执行完addNode后又把返回的实例赋值给了this.tree,最终就形成了实例.tree = 实例的循环引用结构
3. 修复方案
只需要修改insert方法的调用逻辑,给addNode传入正确的根节点this.tree,同时不需要额外赋值(因为对象是引用传递,addNode会直接修改原树节点):
insert(nums) { if (typeof nums === "number") { addNode(this.tree, nums); return; } for (let number of nums) { addNode(this.tree, number); } }
修复后再次执行打印console.log(lolTree.tree),就会输出正确的二叉搜索树结构,不会再出现循环引用和<ref *1>标记。
内容的提问来源于stack exchange,提问作者TheTanadu
相关产品推荐
相关产品推荐

