1. 引言

在这个系列的前九篇文章里,我们穿越了从 varlet/const、从回调到 async/await、从 Object 到 Map 的进化之路。

但很多同学可能会感到焦虑:“JS 更新太快了!今年出一个新特性,明年又出一个,我感觉永远学不完。”

其实,你不需要“追”着每一个特性跑。JavaScript 的进化是有规律的,它的背后有一个严谨的组织——TC39

本文作为系列的收尾篇,不写具体的代码,而是想教你一套**“渔”**:

  1. JS 的新特性是怎么诞生的?
  2. 看到一个炫酷的“新语法”,怎么判断它能不能在生产环境用?
  3. 现代前端项目是如何通过工具链,让我们提前用上未来的?

2. 正文

2.1 揭秘 TC39 与提案流程

JavaScript 的标准叫 ECMAScript。负责制定这个标准的委员会叫 TC39(Technical Committee 39)。

每一个新特性的诞生,都要经历 5 个阶段,从“想法”到“标准”,就像打怪升级:

  • Stage 0(Strawman)稻草人。有人提了一个想法(比如“我想在 JS 里加管道操作符”),这只是一个初步的提案。
  • Stage 1(Proposal)提案。TC39 成员觉得这事儿靠谱,值得讨论。
  • Stage 2(Draft)草案。初步确定了具体语法和语义描述。这个阶段的特性可能会变,不建议盲目使用。
  • Stage 3(Candidate)候选关键阶段! 语法已经定死,浏览器厂商开始实现这个功能。对于前端开发者来说,Stage 3 的特性通常是可以尝试使用的(通过 Babel 插件),但要注意后续微调。
  • Stage 4(Finished)完成正式标准! 这个特性将被加入到下一个发布的 ES 版本(如 ES2024)中。

结论:只有达到 Stage 4 的特性,才能被视为标准,建议在没有构建工具的生产环境(如静态 HTML)中使用。但在工程化项目中,我们常用 Stage 3 的特性。

2.2 近三年新特性巡礼(复习)

让我们快速复习一下最近几年进入 Stage 4/正式发布的关键特性,看看你都掌握了没:

  • ES2022
    • Top-level await:模块顶层可以直接 await
    • Class 字段声明:class C { #x = 1; }
    • Array.at():支持负索引 arr.at(-1)
  • ES2023
    • 数组的非破坏性方法toSortedtoReversed(不改变原数组)。
    • findLast / findLastIndex:从后往前找。
  • ES2024
    • Object.groupBy:数组分组。
    • Promise.withResolvers:更灵活的 Promise 控制。
  • ESNext(正在路上的明星)
    • Decorators:装饰器(Stage 3,React/Vue 开发者必关注)。
    • Temporal:下一代日期时间 API(Stage 3,干掉 Moment.js 的希望)。
    • Iterator Helpers:像数组方法一样操作迭代器(Stage 3)。

2.3 从提案到生产的策略

既然标准更新这么快,浏览器(尤其是旧浏览器)肯定跟不上。构建工具就是连接“未来 JS”和“现在浏览器”的桥梁。

1. 编译
使用 Babel 或 SWC,将 ES6+ 的代码转译成 ES5。

  • 你可以在 babel.config.js 里配置 targets
  • 比如 "targets": "> 0.25%, not dead" 意思是:支持市场份额超过 0.25% 的浏览器,排除那些已经停止更新的旧浏览器。
  • 配置好后,Babel 会自动决定哪些特性需要转译,哪些特性(如 Promise)只需要引入 polyfill

2. 垫片
有些 API(如 Array.prototype.includes)是没法通过简单转语法实现的,必须在运行时加载一段代码来模拟。这就是 core-js@babel/polyfill 做的事。

3. 升级策略

  • 业务项目:追求稳定。建议配置为“Stage 4” 或 ES2020 规范。
  • 库/组件开发:追求前沿。可以尝试 Stage 3 特性,但在文档里注明需要特定的 Babel 插件支持。

2.4 系列文章总结与学习路线

到这里,我们 “ES2015-ESNext 重要特性” 系列就全部结束了。让我们把这十篇内容串起来,形成一张完整的 “现代 JS 技能树”

  1. 基础语法(地基)
    • 变量:let / const(篇 2)
    • 语法糖:解构、展开、模板字符串(篇 3、8)
    • 类型:BigIntSymbol(篇 9)
  2. 逻辑控制(骨架)
    • 流程:异步编程 Promise / async-await(篇 4)
    • 循环:for...offor...in、数组方法(篇 7)
  3. 组织架构(框架)
    • 模块化:ES Modules(篇 5)
    • 面向对象:class、继承、私有属性(篇 6)
    • 数据结构:MapSet(篇 7)
  4. 生态与未来(进化)
    • 标准库:ObjectStringArray 新增方法(篇 8、9)
    • 工程化:TC39 流程、构建工具(本篇)

给不同水平的学习建议:

  • 初级:熟练掌握篇 2、篇 3、篇 4,这是日常工作 80% 的内容。
  • 中级:搞定篇 5、篇 6、篇 7,能独立开发复杂模块,不再畏惧异步和类。
  • 高级:精通篇 8、篇 9,并关注 TC39 提案,具备技术选型和性能优化能力。

3. 常见问题 (FAQ)

Q1:我学完这个系列,是不是就不用学 TypeScript 了?
A: 不是!JS 的标准在演进,TS 的标准也在演进。TS 不仅提供了类型,还支持一些 JS 还没定稿的新特性(通过 experimentalDecorators 等)。本系列打好了 JS 基础,学 TS 会如虎添翼。

Q2:Babel 现在还必须装吗?现在 Vite 不是很火吗?
A: Vite 底层开发环境用 esbuild(Go 写的超快编译器),生产环境打包用 Rollup。但它们依然需要处理语法转换。虽然 Babel 变慢了,但它对 Stage 3 提案的支持和 Polyfill 的能力依然不可替代。很多 Vite 项目依然会配合 @vitejs/plugin-react@babel/core 使用。

Q3:Node.js 环境下,要不要用 Babel?
A: 现在的企业级 Node.js 项目(如 NestJS、Koa),通常运行环境可控(比如指定用 Node 18)。Node 18 支持绝大部分 ES2022 特性,通常不需要全量 Babel,只有当你要用顶级实验特性或需要兼容旧 Node 版本时才需要。


4. 总结

在这个系列中,我们见证了 JavaScript 从一个“简单的脚本玩具”成长为一门“成熟的工程语言”。

  • 语法let/const、解构、箭头函数让代码更纯粹。
  • 能力PromiseClassModules 让逻辑更严谨。
  • 生态Map/SetIteratorsIntl 让功能更强大。

技术永远在变,但底层原理是相通的。理解了 TC39 的流程,理解了异步与模块的本质,无论未来是 ES2025 还是 ES2030,你都能从容应对。

最后,感谢你跟随这个系列学习到第十篇。

如果觉得本系列对你有帮助,请点赞👍、收藏⭐、关注👀,你的支持是我持续输出的动力!

有问题欢迎在评论区留言:你准备在下一个项目里尝试哪个新特性?

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐