有人可以帮我理解为什么下面的代码导致循环引用吗?
var john = {};
var bob = {};
john.friend = bob;
bob.friend = john;
john = null;
console.log(bob.friend); //{ friend: { friend: [Circular] } }
答案 0 :(得分:4)
bob.friend === john
bob.friend.friend === bob
bob.friend.friend.friend === john
bob.friend.friend.friend.friend === bob
bob.friend.friend.friend.friend.friend === john
等
它在一个永无止境的圆圈中继续,每个对象引用回到圆圈中的下一个对象,直到它回到开始(这个圆圈只有两个成员,这很快)
john = null;
从技术上讲,此答案的第一部分代码中的任何对象都不是john
的匹配项,因为您null
编辑了该变量。它们与john
在<{em> null
作业之前持有的值相匹配。
答案 1 :(得分:1)
它是循环的,因为两个对象都使用属性相互引用,所以它永远不会结束......
另一方面,如果设置john = null
,变量john
将不再引用您的对象,但该对象仍然有效,因为john的引用将保存在内存中,
var john = {name:'john'};
var bob = {name:'bob'};
john.friend = bob;
bob.friend = john;
john = null;
console.log(john);
console.log(bob.friend);
答案 2 :(得分:0)
这是因为对象引用,因为可以通过为两个对象创建新引用来避免(通过使用Object.assign
或spread
)
var john = {};
var bob = {};
john.friend = {...bob};
bob.friend = {...john};
console.log(bob.friend);
&#13;
var john = {};
var bob = {};
john.friend = Object.assign({}, bob);
bob.friend = Object.assign({}, john);
console.log(bob.friend);
&#13;