节目信息
ShopTalk | 2025年2月27日
原文播客:ShopTalk
原文链接:shoptalkshow.com
节目简介
本期节目邀请 TC39 主席 Ujjwal Sharma 深入探讨 JavaScript 语言标准的制定过程。从 TC39 是什么、谁在其中、如何工作,到备受关注的 Temporal API、Signals 信号机制和类型注释提案,带你了解决定 JavaScript 未来的幕后故事。
本期要闻
1. TC39:JavaScript 的守护者
TC39 是 Ecma 国际的第 39 技术委员会,负责设计和演进 JavaScript(正式名称 ECMAScript)的新功能和新特性。这是一个通过共识来运作的委员会,在极少数情况下可能会对平台做出破坏性更改。
嘉宾 Ujjwal Sharma 是 TC39 的三位主席之一,来自 Igalia 公司。他强调主席的角色并非拥有广泛的行政权力,而是承担责任——确保工作有成效、反映用户诉求、在有争议的话题上达成共识。
“我们实际上没有真正的权力,只有责任。” —— Ujjwal Sharma
TC39 的主要成员是”实现者”——正在开发浏览器或其他 JavaScript 引擎的人员。无论是运行在浏览器还是冰箱里的 JavaScript 引擎,任何编写实现该语言代码的人都可以参与其中。
2. Temporal API:JavaScript 最大的语言新增
Temporal 是 TC39 对 JavaScript 日期处理的彻底重新设计,也是语言层面所做出的最重大变更。目前 JavaScript 的 Date 对象存在严重缺陷——它是对 Java 旧版 Date 对象的复制,当 JavaScript 面向公众时,Java 已经重新设计了他们的日期对象。
Temporal 的核心改进包括:
- 统一的日期时间格式,保证解析一致性
- 支持非格里高利历(如希伯来历),并能正确处理闰日和闰年规则
- 新的时间戳格式包含时区和日历信息,具备跨语言互操作性
- 提供明确的方法如”加一个月”,自动处理各种边界情况
“这是我们在语言层面所做出的最重大变更,比国际化命名空间对象的全部内容还要大。” —— Ujjwal Sharma
Temporal 的设计深受 Moment.js 维护者的影响,他们将多年积累的专业知识带回了语言设计中。目前 Temporal 已经可以在生产环境使用,主流浏览器都已实现。
3. Signals 信号机制:前端状态管理的未来
Signals 是目前前端框架广泛采用的状态管理模式,TC39 正在探索将其标准化到 JavaScript 语言中。虽然从引擎角度看实现成本不高,但框架作者们对具体实现方式存在分歧。
“Signals 是其中一个让我感觉浏览器方面回应说’哦,对,我们可以做到’的功能。” —— Chris Coyier
目前该提案仍处于早期阶段,关键问题在于:
- 框架作者对当前版本并不完全满意
- 需要明确 Signals 最终应该是什么样子
- 是否只在迎合某一类用户,以及这个功能对他们有多重要
Ujjwal 表示,TC39 内部的倡导者需要重新将该提案公开,向框架作者们展开讨论,因为如果无法明确该功能对语言的意义,将其加入语言毫无意义。
4. 类型注释提案:让 TypeScript 在浏览器中运行
类型注释提案旨在为 JavaScript 添加语法空间,允许在特定位置放置类型信息——引擎会忽略这些内容,但 TypeScript 可以正常工作。
核心理念是:
- 在语言中预留 TypeScript 放置类型的语法空间
- 将冒号与花括号之间的空白区域转换为注释
- 引擎直接忽略类型信息,无需编译即可运行
“你可以将大量 TypeScript 代码复制粘贴到控制台中直接运行,无需进行编译。” —— Ujjwal Sharma
这个提案面临的主要挑战:
- TypeScript 语法非常复杂,如何安全地移除
- 对 TypeScript 用户而言有多实用,对不使用 TypeScript 的人又有多实用
- TypeScript 可以随意演进,但一旦标准化就会受到限制
5. TC39 的决策哲学:预算与妥协
TC39 有一个核心概念——”预算”。每添加一个新功能都会增加语言复杂度,带来解析开销和潜在的性能影响。随着预算的消耗,委员会变得越来越保守。
“最大的风险是错误地判断某人对某事的兴趣程度,或误判某事的实际价值。” —— Ujjwal Sharma
这导致一个有趣的现象:功能需要设计得让所有人满意才能通过。任何人的反对都可能损害提案,迫使提案者必须非常注重外交技巧。
金句摘录
“我们实际上没有真正的权力,只有责任。” —— Ujjwal Sharma
“最大的风险是错误地判断某人对某事的兴趣程度,或误判某事的实际价值。” —— Ujjwal Sharma
“双方的观点都是正确的——引擎开发者正确,因为添加功能确实存在成本;用户正确,因为语言需要不断演进。” —— Ujjwal Sharma
“网页在构建平台方面取得了巨大成功,它不仅是一个优秀的开发平台,还尊重内容创作者。” —— Ujjwal Sharma
🤔 思考与启发
本期节目展现了 JavaScript 语言标准制定的深度思考:
- 复杂性与实用性的平衡: 每个新功能都会增加语言复杂度,TC39 必须在开发者需求和语言健康之间找到平衡点。BigInt 是一个例子——它给语言带来了大量复杂性,但有人认为值得这么做。
- 共识驱动的保守策略: TC39 的流程设计使得任何反对都可能阻止提案,这看似低效,但确保了网络平台的稳定性。几十年前的网站至今仍能正常运行,正是因为这种保守态度。
- 开发者与实现者的视角差异: 网页开发者关心的是”我能做什么”,引擎开发者关心的是”这会多慢”。TC39 的工作就是在这些不同视角之间找到平衡。
延伸思考: 如果你是 TC39 成员,面对 Signals 这样的提案——技术上可行、开发者有需求,但框架作者不满意——你会如何推动它前进?
关于主播
主播辛宝 Otto 目前在做《Web Worker – 前端程序员都爱听》播客,欢迎移步访问收听。
