javascript - ES6 const 会影响垃圾回收吗?

标签 javascript garbage-collection constants ecmascript-6

在凯尔·辛普森 (Kyle Simpson) 的新标题《你不知道 JS:ES6 及以后》中,我找到了以下代码片段:

WARNING Assigning an object or array as a constant means that value will not be able to be garbage collected until that constant’s lexical scope goes away, as the reference to the value can never be unset. That may be desirable, but be careful if it’s not your intent!

(摘自:Simpson, Kyle。“你不知道 JS:ES6 及其他。”O'Reilly Media, Inc.,2015-06-02。iBooks。 该 Material 可能受版权保护。)

据我所知,他没有对此进行详细说明,并且在 Google 上搜索 10 分钟也没有发现任何结果。这是真的吗?如果是,那么“对值的引用永远不能被取消设置”究竟意味着什么?我已经养成了将不会更改的变量声明为 const 的习惯,这在实际具体性能/内存方面是一个坏习惯吗?

最佳答案

WARNING Assigning an object or array as a constant means that value will not be able to be garbage collected until that constant’s lexical scope goes away, as the reference to the value can never be unset. That may be desirable, but be careful if it’s not your intent!

该注释听起来有点多于必要的警告(甚至有点愚蠢),并试图从这种情况中找出某种特殊情况。

使用 const 变量声明时,您无法为变量分配类似 ""null 之类的内容来清除其内容。这实际上是内存管理方面的唯一区别。自动垃圾回收完全不受是否声明为 const 的影响。

因此,如果您希望将来能够出于任何原因更改变量的内容(包括手动删除对某些内容的引用以允许更快地进行垃圾收集),那么不要使用 常量。这与使用或不使用 const 的任何其他原因相同。如果您希望能够在将来的任何时间(出于任何原因)更改变量包含的内容,则不要使用 const。对于任何理解 const 用途的人来说,这应该是完全显而易见的。

在我看来,将垃圾收集作为不使用 const 的特殊情况似乎很愚蠢。如果您希望能够清除变量的内容,那么这意味着您想要修改该变量,所以不要使用 const。是的,在可能陷入持久范围/闭包的大型数据结构上手动启用垃圾收集是您将来可能想要更改变量的原因之一。但是,这只是数百万个原因之一。所以,我再重复一次。如果您将来出于任何原因想要更改变量的内容,请不要将其声明为 const

垃圾收集器本身不会将 const 变量或其指向的内容视为与 varlet 变量不同的内容。当它超出范围并且不再可访问时,其内容将有资格进行垃圾回收。

const 有很多优点。它允许开发人员声明一些意图,即该变量指向的内容不会被代码更改,并且可能允许运行时进行一些优化,因为它知道变量的内容无法更改。而且,它可以防止恶意或意外代码更改该变量的内容。当在适当的情况下使用时,这些都是好东西。一般来说,您应该尽可能多地使用 const

<小时/>

我应该补充一点,即使是一些const数据仍然可以减小大小,并使其大部分内容可用于垃圾收集。例如,如果您在 const 数组中有一个非常大的 100,000 个对象元素数组(您可能从某些外部 http 调用接收到该数组):

const bigData = [really large number of objects from some API call];

您仍然可以通过简单地清除数组来大幅减少数据的大小,这可能会使数组中的大量对象有资格进行垃圾回收(如果没有其他对象引用它们):

bigData.length = 0;

请记住,const 会阻止对该变量名称进行赋值,但不会阻止更改该变量指向的内容。

您可以对其他内置集合类型执行相同的操作,例如 map.clear()set.clear() 甚至任何自定义对象/类有减少内存使用的方法。

关于javascript - ES6 const 会影响垃圾回收吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31686412/

相关文章:

javascript - 让 JavaScript 创建一个完整的 li

java - 我试图优化(内存)我的程序,但 GC 仍然让它滞后

java - 未使用的对象在堆栈中仍然可见时是否可用于垃圾回收?

c++ - 强制调用常量版本成员函数

javascript - Next.js - 导入 css 文件不起作用

javascript - 如何使用 jquery 切换所有子元素的只读属性

java - 删除键时如何从 LinkedHashMap 对象中删除监听器

全局常量文件中的 Objective-C typedef 枚举

powershell - 在 Powershell 中执行以数值开头的 $PATH 中的 EXE?

javascript - "Partial Function Application"在 Javascript 上下文中是用词不当吗?