RefCollection ?
- 阶段: 未分阶段
- 状态: 已撤回
- ECMAScript 版本: —
- 同步时间: 2026年8月26日
- English original · 官方仓库
RefCollection 提供了一种通过符号(symbols)保存对对象的稳定引用的方式,从而无需修改对象即可遍历引用。它旨在与 Records 和 Tuples 协作,允许在不可变结构中引用函数和其他值。
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
RefCollection
ECMAScript 提案:RefCollection。
作者:
- Robin Ricard(彭博)
推动者:
- Robin Ricard(彭博)
- Richard Button(彭博)
顾问:
- Dan Ehrenberg(Igalia)
阶段: 0
概述
RefCollection 引入了一种通过符号(symbols)来保存对对象的引用(value references)的方式。
其主要目标之一是能够在 Records and Tuples 中跟踪对象,而不会在其中引入任何可变内容。
RefCollection 能够自动跟踪符号,使得当符号变得不可达时(并且由于符号无法伪造),被引用的对象也可以变得不可达。
示例
与 Records and Tuples 结合使用
API
new RefCollection()
创建一个 RefCollection。不接受任何初始化参数。
RefCollection.prototype.ref(obj, sym = Symbol())
为对应的对象 obj 返回一个稳定的 symbol。
你可以可选地提供一个符号 sym,如果需要一个新符号,它将使用该符号。如果 obj 已经存在于 RefCollection 中,sym 将被丢弃。如果 sym 已经指向了 RefCollection 中的某个对象,则预期会抛出 TypeError。
RefCollection.prototype.deref(sym)
返回与符号 sym 对应的对象。如果传入的 symbol 不是由同一个 RefCollection 返回的,你将收到 undefined。
行为
对象-引用稳定性
该集合不允许你更改或删除其中的内容,只允许添加。因此,对于同一个对象,预期获得相同的引用符号。
不可达性
当集合变得不可达时,RefCollection 会将所有被跟踪的对象标记为不可达。
如果某个符号独立地变得不可达,由于符号无法被重新伪造,集合会将相应的对象标记为从集合中不可达。
注意:第二点无法通过 polyfill 实现。
Polyfill
你可以在 同一仓库中找到 polyfill。
常见问题
为什么使用符号?
符号是表示引用的好方法,因为我们无法重新伪造它们来从无到有地重新创建引用(而数字或字符串是可以被伪造的)。