For AI agents: the complete documentation index is available at /tc39-atlas/llms.txt, the full documentation bundle is available at /tc39-atlas/llms-full.txt, and this page is available as Markdown at /tc39-atlas/proposals/proposal-readonly-collections.md.
  • 简体中文
  • Readonly Collections S1

    中文标题:只读集合

    提案概览
    提案速览

    该提案通过向所有可枚举集合添加snapshotdivergereadOnlyView方法,以及新的FixedMapReadOnlyMap类,解决了 JavaScript 中缺少不可变集合的问题。它旨在分离查询与修改能力,并通过里氏替换原则定义了行为子类型。

    Note

    以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。

    只读集合提案

    所有集合的snapshotdivergereadOnlyView方法

    作者:Mark S. Miller (@erights) 和 Peter Hoddie (@phoddie)

    状态

    已提交至 TC39(JavaScript 标准委员会),达到第 1 阶段。

    向 TC39 的演示

    幻灯片

    提案

    目前,JavaScript 的集合是无条件可变的。然而,许多用例可以受益于将查询集合的能力与修改集合的能力分开。事实上,我们已多次看到对此类支持的呼吁。为了最小化新 API 的认知负担,我们提议仅向所有集合添加三个新方法,并添加新的集合类,这些类的 API 只是现有集合抽象的子集。我们提议这些方法适用于所有 EcmaScript 可枚举集合,即除WeakMapWeakSet之外的所有 EcmaScript 集合。我们以Map作为具体示例来说明一般情况。为了简洁,我们将类似类的构造函数(如Map)视为类。

    目前我们有一个代表可变变体的Map类,我们将添加FixedMapReadOnlyMap。我们将这些类作为Map类的静态成员添加,以避免污染全局命名空间。这三个类都将支持在此提议的snapshotdivergereadOnlyView方法。此外,FixedMapReadOnlyMap将支持Map的仅查询方法,但不支持任何会修改映射的方法。它们具有完全相同的 API,但行为契约不同。

    遵循里氏替换原则,我们将类型视为行为契约。当 B 的实例遵守 A 对 A 实例行为的规范时,类型 B 是类型 A 的行为子类型。根据这些标准,MapFixedMapReadOnlyMap是假设的AbstractMap的行为子类型,AbstractMap又具有与FixedMapReadOnlyMap完全相同的 API,但具有Map也遵守的较弱的行为类型。此外,FixedMapReadOnlyMap的行为子类型。目前,我们不提议实际创建这个抽象超类型AbstractMap,而是将其视为规范虚构。

    下面 API 定义中的类型根据这些行为子类型关系进行陈述。

    API

    class AbstractMap {
    
            // 一个 FixedMap,不一定是新的,其状态是此映射的当前状态。
            snapshot() :FixedMap;
    
            // 一个新 Map,其初始状态是此映射的当前状态。
            diverge() :Map;
    
            // 一个 ReadOnlyMap,不一定是新的,其状态是此映射当前状态的只读视图。
            readOnlyView() :ReadOnlyMap();
    
            // Map 的仅查询方法
            ...
    }
    
    class Map obeys AbstractMap {
    
            // AbstractMap 的方法
            ...
    
            snapshot() :FixedMap;  // 必定是新的
    
            readOnlyView() :ReadOnlyMap();  // 必定是新的
    
            // 以及 Map 的修改方法
            ...
    }
    
    // ReadOnlyMap 的实例只提供查询能力,不能更新。
    class ReadOnlyMap obeys AbstractMap {
    
            readOnlyView() :ReadOnly;  // 返回自身
    }
    
    // 此映射的内容不能改变。
    class FixedMap obeys ReadOnlyMap {
    
            snapshot() :FixedMap;  // 返回自身
    
            readOnlyView() :ReadOnly;  // 返回自身
    }
    

    在适当的实现上,如 Moddable 的 XS,这些集合的“*Fixed”版本通常可以放入 ROM。这对于像ArrayBuffer这样的数据集合尤其有价值。

    Shim

    只读集合 Shim 是这个提案的 shim 的一个开始。

    相关

    该提案基于 E 语言的 集合类 的经验。