指向null的javascript对象链是否会被垃圾收集?
我只是在用javascript做一些范围界定的实验。 我的问题:在下面的代码片段中,“second”和“third”会被垃圾收集吗?这在处理链表时特别有用指向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的引用。
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对象时,它们可以相互关联。