1

我想知道缺少任何引用的对象的实例是否最终会自动销毁/替换为实例化新对象的时间。

例如:

let foo = new Object();
foo = "foo"

由创建的实例是否new Object()被销毁,因为不再有对它的引用?

内存中的该实例会发生什么?

我们做一个新的那一刻,所说的内存空间会被替换new Object()吗?

4

1 回答 1

2

由创建的实例是否new Object()被销毁,因为不再有对它的引用?

可能,最终。细节不是您可以在代码中直接观察到的,¹并且不在 JavaScript 规范中。垃圾收集(回收应用程序不再引用的内存)是 JavaScript 引擎的一个极其复杂的领域,编写和维护这些引擎的人在努力使我们的代码运行时,不断地对其进行审查和改进尽可能快。

内存中的那个实例发生了什么?

就您的代码而言,一旦您不再引用它,该实例就会消失。实际上,当/如果垃圾收集器决定它需要这样做时,实例过去占用的内存可能会在稍后的某个时间(可能更晚)被回收(供将来使用)。

当我们执行一个新的新对象()时,所说的内存空间会被替换吗?

它根据 JavaScript 引擎(V8 vs. SpiderMonkey vs. JavaScriptCore 等)以及内存是充裕还是短缺而有所不同。但同样:就您的代码而言,实例在您无法再引用它的那一刻就消失了。


重要的是不要基于对垃圾收集工作方式的观察或假设来编写代码,原因有几个,包括: 它因 JavaScript 引擎而异;它取决于引擎的特定版本;它因其他情况而异。


¹ 我可能应该提到 JavaScript 刚刚获得了一些新功能(它们将在 ES2021 规范中):WeakRefFinalizationRegistry让您看起来可以在代码中观察垃圾收集。但是这些功能经过精心设计,不会过多地透露垃圾收集器在做什么,以避免人们根据他们看到的情况编写代码。

于 2020-12-08T13:54:34.353 回答