JavaScript基元类型是否被垃圾收集?

JavaScript基元类型是否被垃圾收集?,javascript,garbage-collection,Javascript,Garbage Collection,我知道在Java和C#中,垃圾收集器仅用于引用类型(不用于基本类型),并且仅用于堆,因为Java和C#中的对象存储在堆中 关于JavaScript,引用类型(数组、对象、函数)存储在堆中,而基元类型(number、boolean、string、undefined、null)存储在堆栈中。这里有一个关于这方面的例子 JavaScript中有几种垃圾收集器算法,其主要原理是引用计数。这些算法是标记扫描和参考计数(现代的是标记扫描)。算法计算引用,而基元类型没有引用,我猜它们不能被垃圾收集 在文章中没

我知道在Java和C#中,垃圾收集器仅用于引用类型(不用于基本类型),并且仅用于堆,因为Java和C#中的对象存储在堆中

关于JavaScript,引用类型(数组、对象、函数)存储在堆中,而基元类型(number、boolean、string、undefined、null)存储在堆栈中。这里有一个关于这方面的例子

JavaScript中有几种垃圾收集器算法,其主要原理是引用计数。这些算法是标记扫描和参考计数(现代的是标记扫描)。算法计算引用,而基元类型没有引用,我猜它们不能被垃圾收集

在文章中没有关于如何释放JavaScript基元类型的文字。我的观点是,当当前执行上下文完成其工作时,它将被释放

那么JavaScript实际上是如何管理基元类型变量的内存的呢

中没有任何内容表明原语不是垃圾收集的。同样,规范中也没有任何规定原语是垃圾收集的。事实上,规范中也没有提到对象是垃圾收集的

实际上,该规范根本没有提到内存管理。例如,不使用堆栈的实现是完全兼容的


因此,简单的回答是:您无法知道原语是否是垃圾收集的,因为规范允许这两种情况。

正如@JörgWMittag所说,规范没有告诉我们,除了没有明确的
免费
操作,所以有时除了自动内存管理(例如垃圾收集)之外别无选择

JavaScript定义了以下内容:

基元值是以下内置类型之一的成员:未定义、Null、Boolean、Number、String和Symbol

未定义、Null、Boolean和Number都具有固定大小的格式。例如,数字是根据IEEE 64位浮点定义的。对于局部变量,这些固定大小的格式很可能直接在堆栈上表示,而不是由堆分配。然而,JavaScript变量的类型并不像Java变量那样,因此这些变量可以在执行过程中更改其类型,这意味着有时程序会询问变量的类型,有时需要运行时动态存储类型和值。尽管如此,该信息的大小也可能是固定的(例如指针),这意味着即使是类型和数字的组合,例如,也可以存储在固定大小的堆栈分配存储中

JavaScript通过复制来传输这些基本类型;它没有提供对原始机制的引用(这将使他们的存储管理复杂化)。但是,它确实有闭包,它们捕获的是变量而不是值。这意味着有时局部变量必须超过它们的局部范围,这表明对它们来说,堆是必需的

另一方面,字符串类型可能涉及动态堆分配,因为例如,字符串可以是在被调用函数中生成并返回给调用方的动态大小临时值。在某些情况下,字符串可能不会被堆分配(例如,文本),因此不会被垃圾收集


另一方面,Java定义了特定大小的原语类型,而String不是其中之一(String是一种对象类型)。

您可以回答自己的问题。堆栈上的东西不需要被垃圾收集,因为它们有一个非常明确的终止期限:当它们所属的范围关闭时。将其详细写下来作为答案,这样我就可以接受它。也请分享一些你发现它的文章。