tc39/proposal-optional-chaining-assignment · 文件 下载 ZIP
文件最后提交记录最后更新时间
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈
可选链式赋值
关于在赋值运算符左侧添加可选链式支持的建议:a?.b = c。
当前状态
- 提倡者:Nicolò Ribaudo
- 阶段:1
- 幻灯片:
设计动机
通常情况下,你需要为对象的某个属性赋值,但前提是该对象确实存在。
标准的做法是使用if语句来保护赋值操作:
if (obj) obj.prop = value;
该语言提供了一种方式来_读取_对象的属性,但仅限于对象确实存在时(obj?.prop = value),而开发者必须记住,在赋值操作时并不支持相同的语法。
使用场景
有关此功能在 Babel 和 TypeScript 代码库中可发挥作用的示例,请参见此 gist]。
你可以通过搜索if \((.*?)\)[\s\n]*\{?[\s\n]*\1\.来查找自己在项目中可能使用可选链式赋值的场景。该正则表达式可能会存在误报和漏报的情况,但可以作为一个潜在的起点。
描述
本建议引入了以下语法:
| 新语法 | 对应的 ES2023 语法 |
|---|---|
expr1?.prop = val | expr1 == null ? undefined : expr1.prop = val |
expr1?.prop += val | expr1 == null ? undefined : expr1.prop += val |
expr1?.prop ??= val | expr1 == null ? undefined : expr1.prop ??= val |
expr1?.[key] = val | expr1 == null ? undefined : expr1[key] = val |
expr1?.foo().prop[key] = val | expr1 == null ? undefined : expr1.foo().prop[key] = val |
实现情况
- Babel (7.23.0)
- TypeScript(得益于错误恢复机制,在 transform 阶段有部分支持](https://www.typescriptlang.org/play?#code/DYUwLgBAhgXBB2BXYwIB8IG8IA85IFsAjEAJwgF8BuAKBqgH4A6HCAXggEZbGWIBqDgGZaQA))
- V8
- JSC
- SpiderMonkey