Javascript对象中的循环引用?

时间:2018-03-27 13:03:20

标签: javascript

有人可以帮我理解为什么下面的代码导致循环引用吗?

var john = {};
var bob = {};
john.friend = bob;
bob.friend = john;
john = null;
console.log(bob.friend); //{ friend: { friend: [Circular] } }

3 个答案:

答案 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.assignspread

&#13;
&#13;
var john = {};
var bob = {};
john.friend = {...bob};
bob.friend = {...john};
console.log(bob.friend);
&#13;
&#13;
&#13;

&#13;
&#13;
var john = {};
var bob = {};
john.friend = Object.assign({}, bob);
bob.friend = Object.assign({}, john);
console.log(bob.friend);
&#13;
&#13;
&#13;