【发布时间】:2016-12-27 20:24:38
【问题描述】:
例如,我有这样的代码:
var objectA = {};
var objectB = {};
objectA.pointer = objectB;
objectB.pointer = objectA;
objectA = null;
objectB = null;
我假设在最后两个语句之后,没有对最初分配给 objectA 和 objectB 变量的对象的引用。但根据技术文献,这些对象的参考仍然存在。为什么 ? objectA.pointer 引用或 objectB.pointer 引用是否仍然存在,即使 objectA 和 objectB 设置为 null ?
【问题讨论】:
-
objectA = null;仅将 变量objectA的值设置为null。它不会更改 propertyobjectB.pointer的值。objectB.pointer仍然指的是一个对象。变量/属性只是值的容器。分配“复制”该值,现在两个容器包含“相同”值(每个都有自己的副本)。替换其中一个容器中的值不会神奇地替换另一个容器中的值。 -
将
objectA设置为null不会改变objectB.pointer -
@FelixKling:如果 objectB 设置为 null,objectB.pointer 如何引用该对象?
-
同样,变量和属性是容器。当您执行
objectB.pointer = objectA;时,您将 content 从一个容器复制到另一个容器。换句话说,objectB.pointernot 指的是 containerobjectA而是指它拥有/拥有的 value。稍后当您执行objectA = null;时,您正在更改 containerobjectA的 content。这对objectB.pointer没有影响。这是一个更简单的示例:var foo = 42; var bar = foo; foo = 0;。即使我将foo设置为0,bar仍然具有42的值。更改foo的值对bar没有影响。 -
@FelixKling 我了解原始值和参考值之间的复制是如何工作的。我在说的是:在我的示例中有两个对象。一开始他们有一个引用——第一个对象在objectA中有引用,第二个对象在objectB中有引用。然后为这些对象创建第二个引用。第一个对象在 objectB.pointer 中有第二个引用,第二个对象在 objectA.pointer 中有第二个引用。那么我们如何将两个对象的引用减少到零呢?我假设这是通过将 objectA 和 objectB 都设置为 null 来实现的。
标签: javascript circular-reference