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-symbol-predicates.md.
  • 简体中文
  • Symbol Predicates S2

    中文标题:符号谓词

    提案概览
    提案速览

    该提案引入了两个新的谓词,Symbol.isRegistered 和 Symbol.isWellKnown,以根据符号是否已注册或是否为众所周知的符号来区分它们。它帮助库确定符号是否可以用作 WeakMap 键,或者它是否真正唯一。

    Note

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

    符号谓词提案

    状态

    阶段 2

    负责人:Ashley Claymore, Jordan Harband

    作者:Robin Ricard, Ashley Claymore, Jordan Harband

    动机

    一个引入区分符号的方法的提案。

    本提案添加了以下谓词:

    • Symbol.isRegistered(symbol)
    • Symbol.isWellKnown(symbol)

    并非所有符号都是相同的,了解它们的更多信息可能很有用,特别是对于库来说。

    根据用例的不同,知道一个符号是真正唯一的、可伪造的(已注册的)还是跨领域共享的(众所周知的),可能很重要。

    例如,符号作为 WeakMap 键要求符号不能是已注册的。

    使用场景

    你可以在库中检测一个符号是否可以用作 WeakMap 键:

    function isWeakMapKey(key) {
      switch (typeof key): {
        case "object":
          return key !== null;
        case "function":
          return true;
        case "symbol":
          return !Symbol.isRegistered(sym);
      }
      return false;
    }
    
    isWeakMapKey({}); // true
    isWeakMapKey(Symbol()); // true
    isWeakMapKey("foo"); // false
    isWeakMapKey(Symbol.for("foo")); // false
    isWeakMapKey(Symbol.asyncIterator); // true

    你还可以找出你是否被给予了一个真正唯一的符号:

    const isUniqueSymbol = sym => typeof sym === "symbol" && !(Symbol.isRegistered(sym) || Symbol.isWellKnown(sym));
    
    isUniqueSymbol(Symbol()); // true
    isUniqueSymbol(Symbol.for("foo")); // false
    isUniqueSymbol(Symbol.asyncIterator); // false
    isUniqueSymbol({}); // false

    描述

    Symbol.isRegistered(value)

    接受一个未知值作为唯一参数,返回一个布尔值:如果该符号是已注册的,则为 true,否则为 false

    Symbol.isWellKnown(value)

    接受一个未知值作为唯一参数,返回一个布尔值:如果该符号是 ECMA262 和 ECMA402 定义的众所周知的符号之一,则为 true,否则为 false

    实现

    请注意,下面两个谓词包不是 polyfill;但它们与当前的规范文本精确匹配,因此它们代表了本提案的有效实现。


    维护提案仓库

    1. spec.emu 进行你的更改(ecmarkup 使用 HTML 语法,但并不是 HTML,所以我强烈建议不要将其命名为 ".html")
    2. 任何对规范进行有意义的更改的提交,都应运行 npm run build 并提交生成的输出。
    3. 每当你更新 ecmarkup 时,运行 npm run build 并提交来自该依赖项的任何更改。