【问题标题】:What happens if an instance of an object has no references to it?如果一个对象的实例没有对它的引用会发生什么?
【发布时间】:2023-04-01 17:39:01
【问题描述】:

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

例如:

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

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

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

当我们创建一个新的new Object() 时,内存空间会被替换吗?

【问题讨论】:

    标签: javascript typescript object reference instance


    【解决方案1】:

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

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

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

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

    当我们执行新的 new Object() 时,内存空间会被替换吗?

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


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


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

    【讨论】:

    • 哦该死的,这太快了!谢谢 :D PD:你能给我推荐任何书籍/文档来了解 JS 和 TS 的见解吗?最好的问候!
    • @MrFrenzoid 转到克劳德先生的个人资料页面。是的,有一本书他可以推荐……
    猜你喜欢
    • 2020-11-15
    • 2012-11-17
    • 1970-01-01
    • 2016-07-19
    • 2014-12-29
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多