指向null的javascript对象链是否会被垃圾收集?

指向null的javascript对象链是否会被垃圾收集?,javascript,performance,garbage-collection,Javascript,Performance,Garbage Collection,我只是在用javascript做一些范围界定的实验。 我的问题:在下面的代码片段中,“second”和“third”会被垃圾收集吗?这在处理链表时特别有用 var first = {} var second = first; var third = second; first = null; 不。second和third仍然有对对象的引用,因此它还不能被垃圾收集 执行此操作时: var first = {}; var second = first; 变量second没有对first的引用。

我只是在用javascript做一些范围界定的实验。 我的问题:在下面的代码片段中,“second”和“third”会被垃圾收集吗?这在处理链表时特别有用

var first = {}
var second = first;
var third = second;

first = null;

不。
second
third
仍然有对对象的引用,因此它还不能被垃圾收集

执行此操作时:

var first = {};
var second = first;
变量
second
没有对
first
的引用。它引用了
首先指向的同一对象。因此,现在有两个相等的变量,它们都有对同一对象的引用

设置时:

 first = null;
您所做的只是清除
first
变量中对该对象的引用。对象本身根本没有受到影响。而且,对于您的问题来说,最重要的是,变量
second
根本没有受到影响,因此它仍然有一个对该对象的引用,因此它不能被垃圾收集

对于要进行垃圾收集的Javascript中的对象,在可访问代码中的代码中任何地方都不能有对该对象的实时引用。只要
second
仍然是一个可访问的变量,它指向的对象就不能被垃圾回收


如果你知道一个像C++那样有指针的语言,那么你可以想到一个类似于

的任务。
var first = {};
例如,首先将指向对象的指针放入
first
实际上并不包含对象本身。对象自身存在
first
仅包含指向该对象的点

然后,当您这样做时:

var second = first;
创建另一个变量,从
第一个
获取指针,并将同一点的副本放入
第二个
。现在有两个完全独立的变量,它们都包含指向对象的指针。请记住,对象是独立存在的,因此当您执行以下操作时:

first = null;
您所做的只是首先清除
中的指针。该对象仍在那里,
second
仍然包含指向它的指针。由于仍然有指向它的活动指针,因此不会对该对象进行垃圾收集


对于要进行垃圾收集的对象,您需要清除包含对象引用的所有三个变量,如下所示:

var first = {}
var second = first;
var third = second;

first = null;
second = null;
third = null;

或者,您需要所有三个变量都超出范围,以便变量本身被垃圾收集。

简短回答:是。你能猜出原因吗?对象在第二和第三阶段仍然可用,所以不,它没有得到GC。@JanDvorak-这是不对的。只要
second
third
仍在某个范围内(即使只是在闭包中),对象仍有活动引用。MDN提到了较旧的“引用计数”算法和较新的“标记和扫描”。算法对对象的引用是否重要@Duco—这些只是垃圾收集器用来跟踪活动引用的实现方法。垃圾收集的目的是相同的。好的、可靠的和快速的垃圾收集器并不容易,特别是当对象数量越来越多,它们之间的关系变得复杂时,以及当您希望能够收集部分作用域而不存在任何循环引用问题时。此外,浏览器还有两个要收集的对象空间(Javascript和DOM),当Javascript引用DOM对象时,它们可以相互关联。