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/stage/3/proposal-iterator-includes.md.
  • 简体中文
  • Iterator Includes S3

    中文标题:迭代器 Includes

    提案概览
    提案速览

    该提案向Iterator.prototype添加了一个includes方法,允许开发者检查迭代器是否产生特定值,类似于Array.prototype.includes。它满足了在迭代器输出中查找内容的简单标准方式的需求,避免了使用some的自定义比较器。

    Note

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

    迭代器 Includes

    一个TC39提案,允许开发者询问迭代器是否产生给定的值。类似于Array.prototype.includes

    阶段: 3。进一步推进依赖于2个或更多实现已落地。

    规范: https://tc39.es/proposal-iterator-includes/

    向委员会所做的演示

    动机

    本提案与原始的 Array.prototype.includes 提案 具有相同的动机。正如你在数组中所做的那样,有时你需要询问迭代器是否会生成给定的值。与数组一样,你可以使用带有自定义比较器的 some,但这并不理想,因为它不能直接表达你的意图,而且每次需要这样做时,你可以使用多种比较操作之一,而这个选择通常并不重要。应该有一种简单、简洁、标准的方式来在迭代器生成的值中查找某个内容。

    设计问题

    比较操作

    至少有4种内置的比较操作,人们可能想要用于 includes:严格相等(===)、宽松相等(==)、SameValue(Object.is)和SameValueZero(Array.prototype.includes)。在真空中,我们可以争论SameValue与SameValueZero的优缺点,以及哪个最适合已知的流行用例,但我认为没有任何论据会比选择SameValueZero以匹配Array.prototype.includes更有说服力。

    第二个参数(fromIndex)

    Array.prototype.includes 有一个第二个参数,它从给定索引开始搜索,而不是从数组的开头。这对数组API有意义,因为替代方案(先切片)会首先分配另一个数组,然后从该索引处进行复制。迭代器有 drop,因此包含此参数是不必要的,但为了避免已经熟悉数组方法的人感到困惑,我们选择包含它。不幸的是,在接口上仍然存在差异,因为迭代器方法不能接受负偏移量,这会是一个令人惊讶的差异,但在上下文中是有意义的。或者,如果提供了第二个参数,我们可以抛出错误,但这在JavaScript内置对象中将是非常不寻常的行为。

    所选方案

    一个名为 includes 的新的 Iterator.prototype 方法。

    function* gen() { yield 1; yield 3; };
    gen().includes(1); // true
    gen().includes(2); // false
    gen().includes(3); // true
    
    gen().drop(1).includes(1); // false
    gen().drop(1).includes(3); // true
    gen().drop(2).includes(3); // false