TC39(ECMAScript标准制定委员会)负责推进JavaScript(ECMAScript)的语言演进,其提案采用五阶段流程(Stage 0–4)。每个阶段代表提案的成熟度,需经委员会审查和社区反馈。以下是各阶段的核心意义及典型案例:
📌 Stage 0: Strawman(草案阶段)
- 目标:正式提交想法,开启初步讨论。
- 要求:需由TC39成员或注册贡献者提交,描述问题并给出初步解决方案。
- 产出:无规范文本,仅需说明提案动机。
- 典型案例:
- 历史提案如
Observable
(异步数据流处理)始于此阶段。
- 历史提案如
⚙️ Stage 1: Proposal(提案阶段)
- 目标:确定提案可行性,明确解决方案。
- 要求:
- 提供详细问题描述、解决方案及示例。
- 列出潜在挑战(如语义冲突、性能影响)。
- 定义需实现的API或语法。
- 产出:初步规范草案,包含API定义或语法范例。
- 典型案例:
- Type Annotations(类型注解):旨在让原生JS支持TS风格的类型声明,处于Stage 1(截至2023年)。
Resizable ArrayBuffer
(可伸缩二进制缓冲区)曾在此阶段。
📐 Stage 2: Draft(草案定型阶段)
- 目标:完成规范的正式描述,锁定核心设计。
- 要求:
- 使用ECMAScript规范语言编写完整草案。
- 实现初步的Polyfill或转译器(如Babel插件)。
- 产出:可纳入标准文档的规范文本。
- 典型案例:
Array.prototype.groupBy
:数组分组方法(如按奇偶性分类)。findLast
:从数组末尾反向查找元素。
🧪 Stage 3: Candidate(候选阶段)
- 目标:获得最终设计批准,等待实践验证。
- 要求:
- 规范文本完全定稿,仅允许修正边缘案例。
- 至少一种浏览器或引擎(如Chrome、SpiderMonkey)实现该功能。
- 收集实现过程中的反馈。
- 产出:可被JavaScript引擎集成的稳定规范。
- 典型案例:
Error Cause
(阿里巴巴提案):为Error
构造函数添加cause
属性,支持链式错误追踪(2022年进入Stage 3)。Array.prototype.at
:支持负索引查询数组(如arr.at(-1)
)。
✅ Stage 4: Finished(完成阶段)
- 目标:正式纳入ECMAScript标准。
- 要求:
- 通过两种以上主流引擎(V8、SpiderMonkey、JavaScriptCore等)的兼容性测试。
- 所有测试用例通过验证。
- 由TC39主席签署并入标准。
- 产出:成为当年发布的ECMAScript官方标准的一部分。
- 典型案例:
Promise
(异步编程核心)。Async/Await
(基于Promise的语法糖)。Array.prototype.includes
(数组包含检测)。
当前代表提案示例(截至2025年)
阶段 | 提案名称 | 关键能力 | 状态来源 |
---|---|---|---|
Stage 1 | Type Annotations | 原生JS支持TS风格类型注解(运行时忽略) | |
Stage 2 | Array Group | 按回调函数分组数组元素(groupBy ) | |
Stage 3 | Error Cause | 链式错误堆栈追踪(new Error("msg", {cause}) ) | |
Stage 4 | Array.prototype.at | 支持负索引查询(arr.at(-1) ) |
💎 流程意义与开发者影响
- 渐进严谨:从概念(Stage 0)到生产可用(Stage 4),层层过滤高风险设计。
- 生态协同:Stage 3+的提案可安全用于Babel等工具,提前验证稳定性(如
@babel/plugin-proposal-error-cause
)。 - 标准透明:所有提案公开托管于TC39 GitHub,开发者可追踪进度并参与讨论。
💡 实践建议:生产项目优先采用Stage 4特性;实验性功能(Stage 2–3)需结合转译器并评估兼容性。