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-optional-chaining-assignment.md.
  • 简体中文
  • Optional chaining in assignment LHS S1

    中文标题:赋值左侧的可选链

    提案概览
    提案速览

    该提案将可选链语法扩展到赋值运算符的左侧,使得仅当基对象不为 nullundefined 时才进行属性赋值。它涵盖了简单赋值、复合赋值以及 ??= 等逻辑赋值运算符。

    Note

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

    可选链赋值

    为赋值运算符左侧的可选链添加支持的提案:a?.b = c

    状态

    • 提案负责人:Nicolò Ribaudo
    • 阶段:1
    • 幻灯片:

    动机

    你经常需要为一个对象的属性赋值,但前提是该对象确实存在。

    标准的做法是使用 if 语句保护赋值:

    if (obj) obj.prop = value;

    语言提供了一种仅当对象确实存在时才_读取_其属性的方式(obj?.prop = value),而开发者必须记住相同的语法在赋值时并不受支持。

    使用场景

    参见 这个 gist,其中有此功能在 Babel 和 TypeScript 代码库中会有用的示例。

    你可以通过搜索 if \((.*?)\)[\s\n]*\{?[\s\n]*\1\. 来查找项目中可能使用可选链的示例。这个正则表达式会产生误报和漏报,但它是一个可能的起点。

    描述

    本提案引入了以下语法:

    新语法等效的 ES2023
    expr1?.prop = valexpr1 == null ? undefined : expr1.prop = val
    expr1?.prop += valexpr1 == null ? undefined : expr1.prop += val
    expr1?.prop ??= valexpr1 == null ? undefined : expr1.prop ??= val
    expr1?.[key] = valexpr1 == null ? undefined : expr1[key] = val
    expr1?.foo().prop[key] = valexpr1 == null ? undefined : expr1.foo().prop[key] = val

    实现

    • Babel(7.23.0
    • TypeScript(部分支持,在转换中借助错误恢复)
    • V8
    • JSC
    • SpiderMonkey