学习链表时遇对象循环问题:为何代码产生对象循环引用?
循环引用出现的原因解析
先看你代码里的核心逻辑:
const test2 = function (numb) { let obj1 = { a: 1, b: 2, }; let obj2 = { d: numb, e: null, }; let obj3 = obj2; obj3.b = obj2; console.log(obj3); }; test2(3);
问题出在JavaScript对象的引用类型特性上:
- 执行
let obj3 = obj2;时,并没有复制出一个和obj2完全独立的新对象,而是让obj3和obj2指向内存里的同一个对象。就像两个人拿着同一扇门的钥匙,打开的都是同一个房间。 - 接下来
obj3.b = obj2;,本质是给这个共享的对象添加b属性,并且把属性值设为这个对象本身(因为obj2指向的就是这个对象)。
现在这个对象的结构变成了:
{ d: 3, e: null, b: 这个对象本身 }
所以当你访问obj2.b时,得到的是对象自己;再访问obj2.b.b,还是这个对象,以此类推,就形成了你看到的连续循环引用。
你预期代码仅执行一次,应该是误以为obj3是独立的新对象,但实际上它只是原对象的一个引用,修改obj3的属性等同于直接修改obj2的属性。
内容的提问来源于stack exchange,提问作者Abdulaziz mohammed
相关产品推荐
相关产品推荐

