5

我为 javascript 编写了一个快速而肮脏的双向链表实现。我希望能够一次删除多个(连续的)节点,并且想知道:仅仅切断我要删除的这些最外层节点的末端是否足够,或者我必须单独删除每个节点。如果我正确理解了javascript的垃圾收集,一旦没有任何东西指向那些连续的节点,即使它们仍然相互连接,它们应该由垃圾收集器处理,对吗?如果有人能告诉我如何自己测试或验证这一点,我也将不胜感激。

4

1 回答 1

6

根据MDN

截至 2012 年,所有现代浏览器都提供了一个标记和清除垃圾收集器。过去几年在 JavaScript 垃圾收集(分代/增量/并发/并行垃圾收集)领域所做的所有改进都是该算法的实现改进,但不是对垃圾收集算法本身的改进,也不是它对何时定义的减少“不再需要一个对象”

标记和扫描算法从根对象开始,找到所有可访问的对象,然后收集所有不可访问的对象,因此对于这些浏览器来说,切断节点就可以了。较旧的浏览器使用引用计数,这意味着对象只有在对它们的引用为 0 时才会被收集,因此在这种情况下,双向链表的循环将是有问题的。然后,您需要以某种方式切断连续节点中的循环(将引用设置为 null、删除关键字等)。

因此,如果您正在为现代浏览器进行开发,那么一切都很好,但是如果您想向后兼容 IE6/7 等浏览器,则需要一个稍微复杂的解决方案(总是这样,不是吗...)

于 2012-12-09T01:45:31.617 回答