全网最全 ECMAScript 攻略( 更新至 ES2025)

2025-10-04 01:01:20 战舰工坊

本文写于 2021 年,本次内容做了比较多的更新,包括 ES2025 的新特性和新增的 Stage 2.7,原文地址:全网最全 ECMAScript 攻略(更新至 ES2024)

作为前端开发工程师,ES6 这个词想必不陌生,ECMAScript 这个奇怪发音的名字应该也应该有所了解,你是否好奇过 ECMA 世界的神秘数字代号,ECMA-262 是什么,ESxxx 又是什么,TC39 是什么,Stage 3 、Stage 4 又意味着什么?你是否被层出不穷的 ES20XX 新特性所迷惑,需要掌握该特性到底是哪年推出的吗,这些提案在哪里能够看到,哪些已经可用,历年的 ES 标准去哪里查找?今天我来带大家揭开 ECMAScript 的神秘面纱,彻底理解掌握这些神秘代号,以及截止到 2024 年 ECMAScript 的特性。

另:祝贺我国首个 JS 语言提案在 2021 年 4 月进入 Stage 3,在 2021 年 11 月成功进入 Stage 4,并在 ECMAScript 2022 正式发布,成为事实上的标准,详见 Error Cause。

2025 年 6 月 25 日,Ecma 国际在日内瓦通过了 ECMA-262 第 16 版 ------ ECMAScript® 2025 标准。

ECMAScript 历史

我们首先来看 ECMA 是什么。ECMA ,读音类似"艾克妈",是欧洲计算机制造商协会 (European Computer Manufacturers Association)的简称,是一家国际性会员制度的信息和电信标准组织。1994 年之后,由于组织的标准牵涉到很多其他国家,为了体现其国际性,更名为 Ecma 国际(Ecma International),因此 Ecma 就不再是首字母缩略字了。

了解了这段历史,为了技术写的专业性,如果文章中提到 Ecma 的时候,可以写成 Ecma 或者 ecma,不要写成 ECMA,除非是 ECMAScript 或 ECMA-XXX 这类专有名词。

1995 年,著名的网景公司(Netscape)的 Brendan Eich 开发了一种脚本语言,最初命名为 Mocha,后来改名为 LiveScript,最后为了蹭当时火热的 Java 热度重命名为了 JavaScript。

了解了 Ecma 国际和 JavaScript,就方便了解 ECMAScript 了,ECMAScript 是一种由 Ecma 国际在标准 ECMA-262 中定义的 脚本语言 规范。这种语言在往往被称为 JavaScript 或 JScript ,但实际上 JavaScript 和 JScript 是 ECMA-262 标准的实现和扩展。

神秘的 ECMA-262

上文提到了第一个神秘代码 ECMA-262 ,ECMA-262 到底是什么呢?原来 Ecma 国际的标准,都会以 Ecma-Number 命名,ECMA-262 就是 ECMA 262 号标准,具体就是指 ECMAScript 遵照的标准。1996 年 11 月,网景公司将 JavaScript 提交给 Ecma 国际进行标准化。ECMA-262 的第一个版本于 1997 年 6 月被 Ecma 国际采纳。

尽管 JavaScript 和 JScript 与 ECMAScript 兼容,但包含超出 ECMAScript 的功能。

我们如何查看最新最全的 Ecma 标准呢,可以查看 Ecma 国际官网的 Standards。截止到 2025 年 8 月,最新的 Ecma 标准已经到了 ECMA-426

Ecma 标准涉及的类别非常多,官网因此提供了按照类别和最新修改排序的功能,我们来看看 ECMA-262 属于哪个类别:

ECMA-262 属于"软件工程与接口"类别,该类别一共有 19 个标准,详见上图。注意,ECMA-262 的最新更新日期是 2025 年 6 月,当前最新的标准就是 ES2025。

探秘 Ecma TC39 神秘组织

揭开了 Ecma-262 神秘面纱之后,我们来探秘一个代号名为 TC39 的神秘组织。

其实官网解释的已经很清楚了,我用中文简要概括下:

TC39 是 Technical Committee 39 的简称,是制定 ECMAScript 标准的委员会,由各个主流浏览器厂商的代表构成,主席团三人分别来自 IBM、Bloomberg 和 Igalia,下设 5 个工作组(Task Groups):

TC39-TG1(通用 ECMAScript® 语言,包括语法、语义、类库以及支持该语言的技术)

TC39-TG2(ECMAScript® 国际化 API 标准)

TC39-TG3(安全)

TC39-TG4(Source map 标准)

TC39-TG5 (编程语言标准化实验)

我们经常会看到类似的新闻:XX 公司成为 Ecma TC39 成员。想要加入 TC39 会议,必须先成为 Ecma 会员:

那 Ecma 到底有哪些成员呢?Ecma 官网给出了答案:

几大巨头赫然在列(2025 年 Indeed 公司已不再续费)!TC39 会员一共有 5 种类别,分别是正式会员(Ordinary members)、准会员(Associate members)、中小企业会员(SME members)、小型私营公司会员(SPC members)、非营利组织会议(NFP members),我们来看正式会员和准会员的对比:

准会员没有 Ecma 大会(General Assembly)的投票权!在准会员中,我国还有 3 家:阿里巴巴、字节跳动、360(对比 2021 年,新增字节跳动、减少了腾讯)。

Wait,CHF 70000,这是 70000 法郎?Ecma 果然是欧洲豪门,正式会员年费接近 50 万人民币。算了一下 Ecma 国际会员费收入每年就有 1,172,500 法郎,约 830 万人民币。

了解更多关于 TC39 的内容,可以探索其官网 TC39 -- Specifying JavaScript. 和 GitHub 仓库 Ecma TC39 · GitHub,注意这个仓库很重要 。查看一下 members,发现了 月影、李松峰 和 元彦 三位国内大佬。

TC39 成员最新动态(2025年)

截至 2025 年 8 月,TC39 的中国成员企业保持稳定增长:

Ordinary members:华为继续保持顶级会员身份

Associate members:阿里巴巴、字节跳动、360 继续活跃参与

新动态:更多中国开发者以个人身份参与 TC39 的讨论和贡献,包括在 GitHub 上的提案讨论和规范反馈

值得一提的是,Sujitech(Mask Network)作为小型私营公司会员加入,显示了中国 Web3 企业对标准制定的参与。

其他值得关注的新成员:

Cloudflare - 加入准会员,CDN和边缘计算巨头

Vercel - 加入SME会员,Next.js的母公司

Deno - 加入SPC会员,Node.js创始人的新项目

这些新成员的加入反映了 ECMAScript 生态系统的发展趋势:边缘计算、现代化框架和运行时的重要性日益凸显。

相比 2021 年的数据,会员总数从约 70 个增长到 86 个,显示了全球对 ECMAScript 标准化工作的持续关注。

我们熟悉的 ES6

探究完神秘的 ECMA-262 和 TC39 之后,我们缓口气,来看看我们最为熟悉的 ESX 家族。

上文提到 ECMAScript 是由 Ecma 国际在标准 ECMA-262 中定义的脚本语言规范。到 2015 年,一共发布了 1、2、3、4、5、5.1、6 共 7 个版本(其中 4 被废弃)。

我们常把 5.1 之前的 ECMAScript 版本统称做 ES5 ,将 6 版本之后的版本统称做 ES6 (因为从 2015 年起,ECMAScript 终于步入正轨,每年发布一次版本,到了 2024 年,已经发布了 9 个版本了,实在太多,所以用变革了 JavaScript 时代的 ES6 作为后续版本的代称)。

划重点,Web 前端招聘的 JD 中,经常出现的 ES6,不仅仅是 ES2015 这个版本,而是指代 ES2015 和其后每年发布的 ECMAScript 版本。

从 ECMAScript 第 6 版开始,每年发布一个 ECMAScript 版本,因此 ECMAScript 版本有了很多名字,包括全名 ECMAScript 6、简写 ES6、年份命名 ECMAScript 2015、年份简写 ES2015。最常见的名字还是 ES6,之后推出的 ES7、ES8 等同理。注意 ES6 之后的版本基本上按照年份简称,ES7、ES8 这种简称不常用。

需要注意的是,自从 TC39 进程 制定以来,ECMAScript 版本的重要性就降低了很多。大家不必记住某一个 ES 特性到底是哪年推出的。现在真正重要的是提案处于哪个阶段:一旦提案到了第 4 阶段(Stage4),那么它就可以使用了。但是即使这样,你仍然需要检查你的引擎是否支持该功能。

这里又提到了一个 TC39 进程 和阶段(Stage)的概念,我们接下来看看这两个概念是什么含义。

TC39 进程和 Stage X

TC39 进程 顾名思义,肯定是 TC39 组织发布的一个进程。随着 ECMAScript 6 的发布,当时的发布流程出现了两个明显的问题:

如果在两个 release 之间多次通过早已准备好的功能,势必在其 release 之前等待很长一段时间。而且功能准备如果很晚,会增加 deadline 之前匆忙赶工的风险。

很多功能在其实现和使用之前就花了很长时间在设计上,发现与实现和使用相关的设计缺陷会非常晚。

为了解决上述问题, TC39 建立了新的 TC39 进程:

ECMAScript 功能设计与每年的 ECMAScript 版本发布独立,使用不同阶段(Stage)来区分功能的状态。2023 年 11 月后,新增 Stage 2.7,共有 6 个阶段,从 Stage 0(strawperson)开始,到 Stage 4(finished)结束。

越往后的阶段,需要原型实现和真机测试,可以建立设计和实现之间的反馈机制。

ECMAScript 版本每年发布一次 ,发布的内容包含在 release deadline 之前的全部到达 Stage 4 的功能。

TC39 进程的演进历史

2023 年 11 月后的新 6 阶段流程

2015-2023 年的经典 5 阶段流程

Stage 0:代号"稻草人(strawman)",草案阶段

Stage 1:代号"提案(proposal)", TC39 帮助阶段

Stage 2:代号"草案(draft)", 本阶段很有可能成为标准

Stage 3:代号"候选(candidate)", 已完成,需要从实现中获得反馈

Stage 4:代号"结束(finished)", 准备成为标准

为什么要增加 Stage 2.7?

2023 年 11 月 30 日,TC39 委员会决定在流程中增加 Stage 2.7,主要基于以下考虑:

分离关注点:将"规范完成"(Stage 2)和"测试编写"(Stage 2.7)分离,让每个阶段的目标更加明确

提高确定性:当提案到达 Stage 2.7 时,规范已经冻结,开发者可以更有信心地开始试用

优化审核流程:审核者(reviewers)需要在 Stage 2.7 之前完成签署,避免了后期的反复修改

关于为什么选择 2.7 这个数字,TC39 给出了有趣的解释:

不重新编号是为了避免让历史文档变得难以理解

选择 .7 而非 .5 是因为这个阶段更接近 Stage 3

不使用 3a/3b 是为了避免混淆

我国提案的里程碑

理解了 Stage 各阶段的含义,就能理解我国首个 JS 语言提案在 ECMA 进入 Stage 3 这个新闻的意义了。2021 年 4 月,由阿里巴巴前端标准化小组与淘系技术提出的 Error Cause 提案进入 Stage 3,这意味着:

提案规范已经完成,不会有大的改动

JavaScript 引擎开始实验性实现

这是中国首个推进到如此高阶段的 ECMAScript 提案

该提案最终在 ES2022 中正式成为标准(Stage 4)

如何跟踪提案进展?

想要了解各个提案的最新状态,可以访问以下资源:

TC39 Proposals - 查看所有提案的当前阶段

TC39 ECMA262 - ECMAScript 规范的官方仓库

TC39 Meeting Notes - TC39 会议记录,了解提案讨论细节

💡 开发者建议:从 ES2016 开始,不要再以"这个浏览器支持 ES20XX 吗?"的方式思考,而应该关注具体特性:"这个特性到达 Stage 4 了吗?目标环境支持吗?"这种思维方式更符合现代 JavaScript 的发展模式。

历届 ES 特性全收录 ES2016 - ES2025

网上有太多零散的 ES 特性总结,很多同学想知道,有官方的 ECMAScript 功能列表吗?

当然有,TC39 仓库列出了 已完成提案 以及它们的版本。

自 2015 年 ES6 发布以来的 10 年间,截至 2025 年 8 月 8 日,TC39 已完成 71 个新功能提案(较 2024 年新增 11 个)。最新的提案包括 Uint8Array Base64 转换、Math.sumPrecise、Error.isError 等功能(预计 2026 年发布):

ES2016

Array.prototype.includes

作者:Domenic Denicola

维护者:Domenic Denicola、Rick Waldron

TC39 会议记录: November 2015

发布时间:2016

Exponentiation operator

作者:Rick Waldron

维护者:Rick Waldron

TC39 会议记录: January 2016

发布时间:2016

ES2017

Object.values/Object.entr...

作者:Jordan Harband

维护者:Jordan Harband

TC39 会议记录: March 2016

发布时间:2017

String padding

作者:Jordan Harband

维护者:Jordan Harband、Rick Waldron

TC39 会议记录: May 2016

发布时间:2017

Object.getOwnPropertyDescriptors

作者:Jordan Harband、Andrea Giammarchi

维护者:Jordan Harband、Andrea Giammarchi

TC39 会议记录:May 2016

发布时间:2017

Trailing commas in function parameter lists and calls

作者:Jeff Morrison

维护者:Jeff Morrison

TC39 会议记录: July 2016

发布时间:2017

Async functions

作者:Brian Terlson

维护者:Brian Terlson

TC39 会议记录:July 2016

发布时间:2017

Shared memory and atomics

作者:Lars T Hansen

维护者:Lars T Hansen

TC39 会议记录: January 2017

发布时间:2017

ES2018

Lifting template literal restriction

作者:Tim Disney

维护者:Tim Disney

TC39 会议记录: March 2017

发布时间:2018

s (dotAll) flag for regular expressions

作者:Mathias Bynens

维护者:Brian Terlson、Mathias Bynens

TC39 会议记录: November 2017

发布时间:2018

RegExp named capture groups

作者:Gorkem Yakin、Daniel Ehrenberg

维护者:Daniel Ehrenberg、Brian Terlson、Mathias Bynens

TC39 会议记录: November 2017

发布时间:2018

Rest/Spread Properties

作者:Sebastian Markbåge

维护者:Sebastian Markbåge

TC39 会议记录: January 2018

发布时间:2018

RegExp Lookbehind Assertions

作者:Gorkem Yakin、Nozomu Katō、Daniel Ehrenberg

维护者:Daniel Ehrenberg、Mathias Bynens

TC39 会议记录: January 2018

发布时间:2018

RegExp Unicode Property Escapes

作者:Mathias Bynens

维护者:Brian Terlson、Daniel Ehrenberg、Mathias Bynens

TC39 会议记录: January 2018

发布时间:2018

Promise.prototype.finally

作者:Jordan Harband

维护者:Jordan Harband

TC39 会议记录 :January 2018

发布时间:2018

Asynchronous Iteration

作者:Jordan Harband

维护者:Jordan Harband

TC39 会议记录 :January 2018

发布时间:2018

ES2019

Optional catch binding

作者:Michael Ficarra

维护者:Michael Ficarra

TC39 会议记录 : May 2018

发布时间:2019

JSON superset

作者:Richard Gibson

维护者:Mark Miller、Mathias Bynens

TC39 会议记录: May 2018

发布时间:2019

Symbol.prototype.description

作者:Michael Ficarra

维护者:Michael Ficarra

TC39 会议记录: November 2018

发布时间:2019

Function.prototype.toString revision

作者:Michael Ficarra

维护者:Michael Ficarra

TC39 会议记录:November 2018

发布时间:2019

Object.fromEntries

作者:Darien Maillet Valentine

维护者:Jordan Harband、Kevin Gibbons

TC39 会议记录:January 2019

发布时间:2019

Well-formed JSON.stringify

作者:Richard Gibson

维护者:Mathias Bynens

TC39 会议记录: January 2019

发布时间:2019

String.prototype.{trimStart,trimEnd}

作者:Sebastian Markbåge

维护者:Sebastian Markbåge、Mathias Bynens

TC39 会议记录: January 2019

发布时间:2019

Array.prototype.{flat,flatMap}

作者:Brian Terlson、Michael Ficarra、Mathias Bynens

维护者:Brian Terlson、Michael Ficarra

TC39 会议记录: January 2019

发布时间:2019

ES2020

String.prototype.matchAll

作者:Jordan Harband

维护者:Jordan Harband

TC39 会议记录: March 2019

发布时间:2020

import()

作者:Domenic Denicola

维护者:Domenic Denicola

TC39 会议记录:June 2019

发布时间:2020

BigInt

作者:Daniel Ehrenberg

维护者:Daniel Ehrenberg

TC39 会议记录: June 2019

发布时间:2020

Promise.allSettled

作者:Jason Williams、Robert Pamely、Mathias Bynens

维护者:Mathias Bynens

TC39 会议记录: July 2019

发布时间:2020

globalThis

作者:Jordan Harband

维护者:Jordan Harband

TC39 会议记录: October 2019

发布时间:2020

for-in mechanics

作者:Kevin Gibbons

维护者:Kevin Gibbons

TC39 会议记录: December 2019

发布时间:2020

Optional Chaining

作者:Gabriel Isenberg、Claude Pache、Dustin Savery

维护者:Gabriel Isenberg、Dustin Savery、Justin Ridgewell、Daniel Rosenwasser

TC39 会议记录: December 2019

发布时间:2020

Nullish coalescing Operator

作者:Gabriel Isenberg

维护者:Gabriel Isenberg、Justin Ridgewell、Daniel Rosenwasser

TC39 会议记录:December 2019

发布时间:2020

import.meta

作者:Domenic Denicola

维护者:Gus Caplan

TC39 会议记录: March 2020

发布时间:2020

ES2021

String.prototype.replaceAll

作者:Peter Marshall、Jakob Gruber、Mathias Bynens

维护者:Mathias Bynens

TC39 会议记录: June 2020

发布时间:2021

Promise.any

作者:Mathias Bynens、Kevin Gibbons、Sergey Rubanov

维护者:Mathias Bynens

TC39 会议记录: July 2020

发布时间:2021

WeakRefs

作者:Dean Tribble、Sathya Gunasekaran

维护者:Dean Tribble、Mark Miller、Till Schneidereit、Sathya Gunasekaran、Daniel Ehrenberg

TC39 会议记录: July 2020

发布时间:2021

Logical Assignment Operators

作者:Justin Ridgewell

维护者:Justin Ridgewell、Hemanth HM

TC39 会议记录: July 2020

发布时间:2021

Numeric separators

作者:Sam Goto、Rick Waldron

维护者:Sam Goto、Rick Waldron、Leo Balter

TC39 会议记录: July 2020

发布时间:2021

ES2022

Class Fields ( Private instance methods and accessors , Class Public Instance Fields & Private Instance Fields , Static class fields and private static methods )

作者:Daniel Ehrenberg

维护者:Daniel Ehrenberg、Kevin Gibbons

TC39 会议记录:April 2021

发布时间:2022

RegExp Match Indices

作者:Ron Buckton

维护者:Ron Buckton

TC39 会议记录:May 2021

发布时间:2022

Top-level await

作者:Myles Borins、Yulia Startsev、Daniel Ehrenberg、Guy Bedford、Ms2ger

维护者:Myles Borins、Yulia Startsev

TC39 会议记录:May 2021

发布时间:2022

Ergonomic brand checks for Private Fields

作者:Jordan Harband

维护者:Jordan Harband

TC39 会议记录:July 2021

发布时间:2022

.at()

作者:Shu-yu Guo、Tab Atkins

维护者:Shu-yu Guo、Tab Atkins

TC39 会议记录:August 2021

发布时间:2022

Accessible Object.prototype.hasOwnProperty

作者:Jamie Kyle

维护者:Tierney Cyren、Jamie Kyle

TC39 会议记录:August 2021

发布时间:2022

Class Static Block

作者:Ron Buckton

维护者:Ron Buckton

TC39 会议记录:August 2021

发布时间:2022

Error Cause

作者:Chengzhong Wu

维护者:Chengzhong Wu、Hemanth HM

TC39 会议记录:October 2021

发布时间:2022

ES2023

Array find from last

作者:Wenlu Wang

维护者:Wenlu Wang、Daniel Rosenwasser

TC39 会议记录:June 2022

发布时间:2023

Hashbang Grammar

作者:Bradley Farias

维护者:Bradley Farias

TC39 会议记录:July 2022

发布时间:2023

Symbols as WeakMap keys

作者:Daniel Ehrenberg、Richard Button、Robin Ricard、Leo Balter、Rick Waldron、Caridy Patiño

维护者:Daniel Ehrenberg、Richard Button、Robin Ricard、Leo Balter、Rick Waldron、Caridy Patiño

TC39 会议记录:January 2023

发布时间:2023

Change Array by Copy

作者:Ashley Claymore、Robin Ricard

维护者:Ashley Claymore、Robin Ricard

TC39 会议记录:March 2022

发布时间:2023

ES2024

Well-Formed Unicode Strings

作者:Guy Bedford、Bradley Farias

维护者:Guy Bedford、Bradley Farias、Michael Ficarra

TC39 会议记录:May 2023

发布时间:2024

Atomics.waitAsync

作者:Lars Hansen

维护者:Shu-yu Guo、Lars Hansen

TC39 会议记录:May 2023

发布时间:2024

RegExp v flag with set notation + properties of strings

作者:Markus Scherer、Mathias Bynens

维护者:Mathias Bynens

TC39 会议记录:May 2023

发布时间:2024

Resizable and growable ArrayBuffers

作者:Shu-yu Guo

维护者:Shu-yu Guo

TC39 会议记录:September 2023

发布时间:2024

Array Grouping

作者:Justin Ridgewell

维护者:Justin Ridgewell、Jordan Harband

TC39 会议记录:November 2023

发布时间:2024

Promise.withResolvers

作者:Peter Klecha

维护者:Peter Klecha

TC39 会议记录:November 2023

发布时间:2024

ArrayBuffer transfer

作者:Shu-yu Guo、Jordan Harband、Yagiz Nizipli

维护者:Shu-yu Guo、Jordan Harband、Yagiz Nizipli

TC39 会议记录:February 2024

发布时间:2024

ES2025 新特性

2025 年 7 月正式发布,包含以下新特性:

RegExp.escape

作者: Domenic Denicola、Benjamin Gruenbaum、Jordan Harband

维护者: Jordan Harband、Kevin Gibbons

TC39 会议记录 : 2025 年 2 月

说明: 提供一个静态方法来转义字符串中的特殊正则字符

解决的核心问题:将普通字符串安全地用在正则表达式中,避免特殊字符被误解释。

javascript

复制代码

// ❌ 之前:手动转义容易遗漏

const userInput = "price: $9.99";

const pattern = new RegExp(userInput); // 💥 $ 和 . 会被当作特殊字符

// ✅ ES2025:标准化的安全转义

const escaped = RegExp.escape("price: $9.99");

// 返回: "price:\\x20\\$9\\.99"

const safePattern = new RegExp(escaped); // 正确匹配字面字符串

为什么重要:

🔥 社区呼声极高 :npm 上 escape-string-regexp 包周下载量超 1 亿次

🌍 国际标准对齐 :JavaScript 终于拥有了其他语言早在 20 年前就有的功能(Python re.escape()、Ruby Regexp.escape() 等)

🛡️ 安全保障:避免用户输入导致的正则表达式注入漏洞

典型应用场景:

javascript

复制代码

// 搜索高亮

function highlight(text, term) {

const pattern = new RegExp(`(${RegExp.escape(term)})`, 'gi');

return text.replace(pattern, '$1');

}

// 动态替换

function replaceAll(text, find, replace) {

const pattern = new RegExp(RegExp.escape(find), 'g');

return text.replace(pattern, replace);

}

提案历程 :这个提案从 2015 年开始讨论,历经 10 年终于在 2025 年 2 月达到 Stage 4,成为 ES2025 的一部分。提案仓库已于 2025 年 2 月 18 日归档,标志着这个功能正式定稿。

兼容性:

Float16 on TypedArrays, DataView, Math.f16round

作者: Leo Balter

维护者: Leo Balter、Kevin Gibbons

TC39 会议记录 : 2025 年 2 月

说明: 添加 Float16Array 类型数组和相关的 DataView 方法,以及 Math.f16round

核心价值:为 JavaScript 引入 16 位浮点数(半精度)支持,主要服务于 AI / 机器学习和图形处理场景

javascript

复制代码

// 新的 TypedArray 类型

const float16 = new Float16Array([1.0, 2.5, 3.14159]);

// 内存效率对比

const float32Array = new Float32Array(1000); // 4000 字节

const float16Array = new Float16Array(1000); // 2000 字节(节省50%)

// Math.f16round - 舍入到16位精度

Math.f16round(3.14159); // 3.140625

Math.f16round(65504); // 65504(最大值)

Math.f16round(65505); // Infinity

// DataView 支持

const buffer = new ArrayBuffer(2);

const view = new DataView(buffer);

view.setFloat16(0, 3.14);

console.log(view.getFloat16(0)); // 3.140625

为什么重要:

🤖 AI/ML 优化:大多数神经网络推理可以使用 float16 而不损失精度,内存占用减半

🎮 图形处理:WebGL 和 WebGPU 原生支持 float16,现在 JavaScript 可以直接操作

💾 内存效率:处理大规模数值数据时显著降低内存占用

实际应用场景:

javascript

复制代码

// AI 模型权重存储

async function loadModelWeights(url) {

const response = await fetch(url);

const buffer = await response.arrayBuffer();

// 使用 Float16Array 加载模型权重,节省50%内存

return new Float16Array(buffer);

}

// 图像处理中的颜色值

function processHDRImage(pixelData) {

// HDR 图像使用 float16 存储颜色值

const float16Pixels = new Float16Array(pixelData);

// 处理像素数据...

}

// 与 WebGPU 交互

const gpuBuffer = device.createBuffer({

size: float16Array.byteLength,

usage: GPUBufferUsage.VERTEX,

mappedAtCreation: true

});

new Float16Array(gpuBuffer.getMappedRange()).set(float16Array);

提案历程:Float16Array 提案响应了 Web 平台对高效数值计算的需求,特别是随着 WebGPU 和 AI 应用在浏览器中的兴起。提案仓库于 2025 年 5 月 24 日归档,标志着这个功能正式定稿。

兼容性:

Promise.try

作者: Jordan Harband

维护者: Jordan Harband

TC39 会议记录 : 2024 年 10 月

说明: 提供统一的方式来处理同步和异步函数

解决的核心问题:优雅地将任何函数(同步或异步)包装成 Promise,同时保持同步执行的性能优势。

javascript

复制代码

// ❌ 之前的困境

// 方法1:简单但低效(强制异步)

Promise.resolve().then(() => fn()); // fn 被推迟到下一个微任务

// 方法2:高效但繁琐

new Promise(resolve => resolve(fn())); // 同步执行但写法冗长

// ✅ ES2025:简洁且高效

Promise.try(() => fn()); // 同步执行,自动捕获错误

为什么重要:

• ⚡ 性能优化:函数可以同步执行,避免不必要的异步开销

• 🛡️ 统一错误处理 :无论函数是否抛出异常,都能用 .catch() 处理

• 📦 社区验证 :p-try npm 包周下载量 4400 万次,总下载量 89 亿次

实际应用场景:

javascript

复制代码

// 1. 不确定函数是否异步

function processData(data) {

return Promise.try(() => {

// 可能是同步验证,也可能是异步API调用

return validateOrFetch(data);

}).then(result => {

console.log('处理成功:', result);

}).catch(error => {

console.error('处理失败:', error);

});

}

// 2. 初始化流程的错误处理

Promise.try(() => {

// 可能抛出异常的初始化代码

const config = JSON.parse(configString);

return initializeApp(config);

}).catch(error => {

console.error('初始化失败:', error);

showErrorUI();

});

// 3. 与 async/await 配合

async function main() {

const result = await Promise.try(() => {

// 同步代码也能享受 async/await 的错误处理

return complexCalculation();

});

}

标准化进程:该提案已达到 Stage 4,仓库于 2024 年 10 月 9 日归档。作为 ES2025 的一部分,它填补了 Promise API 中长期存在的空白,让 JavaScript 的异步编程模型更加完整和一致

生态影响:Bluebird、Q、when 等主流 Promise 库早已提供类似功能,ES2025 的标准化意味着开发者终于可以在原生环境中使用这个高频特性,减少对第三方库的依赖。

兼容性:

Sync Iterator Helpers

作者: Gus Caplan

维护者: Michael Ficarra、Jonathan Keslin、Kevin Gibbons

TC39 会议记录 : 2024 年 10 月

说明: 为迭代器添加 map、filter、take、drop 等辅助方法

解决的核心问题:为迭代器提供类似数组的链式操作方法,让迭代器和数组一样易用。

javascript

复制代码

// ❌ 之前:迭代器缺乏辅助方法

function* naturals() {

let i = 0;

while (true) yield i++;

}

// 需要手动转换为数组才能使用 map/filter

const squares = Array.from(naturals())

.slice(0, 10) // 危险!naturals() 是无限的

.map(x => x * x);

// ✅ ES2025:迭代器原生支持链式操作

const squares = naturals()

.take(10) // 安全!惰性求值

.map(x => x * x)

.toArray(); // [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

核心特性一览:

转换方法 : map(), filter(), flatMap()

截取方法 : take(), drop()

聚合方法 : reduce(), toArray()

判断方法 : some(), every(), find()

副作用 : forEach()

静态方法 : Iterator.from()

为什么重要:

🚀 惰性求值:所有方法都是惰性的,只在需要时才消费迭代器

♾️ 无限序列支持:可以安全地处理无限迭代器

🔗 链式调用:提供流畅的函数式编程体验

📚 跨语言一致性:对标 Rust、Python、C# 等语言的迭代器 API

标准化进程:该提案已达到 Stage 4,仓库于 2024 年 10 月 8 日归档。这标志着 JavaScript 终于拥有了现代化的迭代器 API,填补了与 Rust、Python 等语言在迭代器处理能力上的差距。

生态影响:Node.js 的 Readable streams 已经实现了该提案的全部功能。许多流行库如 lodash、itertools 的功能将可以用原生 API 替代,减少项目依赖。

兼容性:

JSON Modules

作者: Myles Borins、Sven Sauleau、Dan Clark、Daniel Ehrenberg

维护者: Myles Borins、Sven Sauleau、Dan Clark、Daniel Ehrenberg

TC39 会议记录 : 2024 年 10 月

说明: 允许直接导入 JSON 文件作为模块

解决的核心问题:安全且标准地导入 JSON 数据,防止 MIME 类型混淆导致的代码注入攻击。

javascript

复制代码

// ❌ 之前的困境

// 方法1:使用 fetch(运行时加载,需要额外解析)

const response = await fetch('./config.json');

const data = await response.json();

// 方法2:依赖构建工具(非标准,不同工具行为不一)

import data from './config.json'; // 需要 webpack/rollup 等支持

// 方法3:动态导入(不够直观)

const module = await import('./config.json');

// ✅ ES2025:标准且安全

import data from './config.json' with { type: 'json' };

为什么重要:

🔒 安全保障 :通过显式 type: "json" 声明,防止服务器返回可执行代码

📦 零依赖:不再需要构建工具或 polyfill 来导入 JSON

🌍 跨平台一致:浏览器、Node.js、Deno 等环境行为统一

⚡ 编译时优化:静态导入允许更好的 tree shaking 和优化

标准化进程:

2020年7月:从 Import Attributes 提案中分离

2024年10月8日:与 Import Attributes 一起进入 Stage 4

最初由 Microsoft 为 V8/Chromium 实现

Apple (Ryosuke Niwa) 和 Mozilla (Anne van Kesteren) 提出的安全考虑促成了当前设计

生态影响:

构建工具简化:Webpack、Rollup、Vite 等可以使用标准语法

类型系统支持:TypeScript 可以提供更好的类型推断

工具链统一:ESLint、Prettier 等工具可以识别标准语法

性能优化:允许更好的静态分析和 tree shaking

兼容性:

Import Attributes

作者: Myles Borins、Sven Sauleau、Dan Clark、Daniel Ehrenberg

维护者: Sven Sauleau、Dan Clark、Daniel Ehrenberg、Nicolò Ribaudo

TC39 会议记录 : 2024 年 10 月

说明: 为模块导入语句添加内联语法,以传递模块说明符之外的更多信息,为 JSON、CSS、HTML 等非 JavaScript 模块类型提供基础设施

解决的核心问题:提供安全、标准化的方式来指定模块类型和其他元数据,防止 MIME 类型混淆攻击。

javascript

复制代码

// ❌ 之前的困境

// 方法1:依赖文件扩展名(不可靠)

import data from './config.json'; // 扩展名不能保证内容类型

// 方法2:依赖 MIME 类型(可被篡改)

import styles from './styles.css'; // 服务器可能返回 JavaScript

// 方法3:使用 URL scheme(复杂且非标准)

import data from 'json:./config.json'; // 伪协议方案

// ✅ ES2025:显式且安全

import data from './config.json' with { type: 'json' };

import styles from './styles.css' with { type: 'css' };

为什么重要:

🔒 安全基础:为所有非 JavaScript 模块提供安全导入机制

🏗️ 可扩展架构 :不仅支持 type,还可扩展其他属性

🌐 跨环境一致性:浏览器、Node.js、Deno 行为统一

⚙️ 向后兼容 :从 assert 到 with 的平滑过渡

标准化进程:

2019-12:Stage 1 作为 "module attributes"

2020-06:Stage 2 限制属性不能作为缓存键

2020-09:Stage 3 改名 "import assertions",使用 assert 关键字

2021-05 到 2022-02:Chrome、Node.js、Deno 实现并发布

2023-01:因与 HTML 语义不兼容降回 Stage 2

2023-03:改名 "import attributes",改回 with 关键字,重回 Stage 3

2024-10:进入 Stage 4

生态影响:

统一模块系统:为 Web 平台的多种资源类型提供统一导入机制

安全性提升:明确的类型声明防止内容注入攻击

工具链标准化:构建工具可以基于标准语法优化

未来扩展性:为更多模块类型和属性预留空间

兼容性:

RegExp Modifiers

作者: Ron Buckton

维护者: Ron Buckton

TC39 会议记录 : 2024 年 10 月

说明: 允许在正则表达式内部动态启用或禁用修饰符标志,提供更精细的模式控制

解决的核心问题:在正则表达式的不同部分应用不同的标志设置,无需拆分成多个正则或使用复杂的变通方案。

javascript

复制代码

// ❌ 之前的困境

// 方法1:使用多个正则表达式

const re1 = /[a-z]/i; // 忽略大小写

const re2 = /[a-z]/; // 区分大小写

// 需要组合使用,逻辑复杂

// 方法2:动态构建正则

const pattern = '[a-z]';

const re = new RegExp(pattern, someCondition ? 'i' : '');

// 方法3:复杂的字符类

/[a-zA-Z][a-z]/ // 第一个字符不区分大小写,第二个区分

// ✅ ES2025:内联修饰符

/^[a-z](?-i:[a-z])$/i; // 第二部分禁用 i 标志

/^(?i:[a-z])[a-z]$/; // 第一部分启用 i 标志

为什么重要:

🎯 精确控制:在正则表达式的特定部分应用不同的标志

📝 配置友好:适用于 JSON 配置、语法高亮器等不能执行代码的场景

🔧 减少复杂性:避免拆分正则或使用复杂的变通方案

🌍 行业标准:与 Perl、PCRE、.NET 等主流正则引擎保持一致

标准化进程:

2021-10-27:提议进入 Stage 1(通过)

2021-12-15:进入 Stage 2(仅限自包含形式 (?i:...))

2022-06-07:进入 Stage 3

2024-10:进入 Stage 4

生态影响:

解析器增强:语法高亮器、代码分析工具可以更精确地处理文本

配置简化:TextMate grammars、JSON 配置可以使用更强大的模式

正则可读性:减少需要拆分或动态构建的正则表达式

跨语言一致性:与 Perl、Python、.NET 等语言的正则语法更接近

兼容性:

New Set Methods

作者: Michał Wadas、Sathya Gunasekaran、Kevin Gibbons

维护者: Kevin Gibbons

TC39 会议记录 : 2024 年 4 月

说明 : 为 JavaScript 的内置 Set 类添加集合运算方法,如 union、intersection、difference 等集合操作方法

解决的核心问题:原生 Set 缺乏基本的集合运算操作,开发者需要手写复杂的逻辑或依赖第三方库。

javascript

复制代码

// ❌ 之前的困境

// 方法1:手写集合运算(繁琐易错)

function intersection(setA, setB) {

const result = new Set();

for (const elem of setA) {

if (setB.has(elem)) {

result.add(elem);

}

}

return result;

}

// 方法2:使用展开运算符和 filter(性能差)

const intersection = new Set([...setA].filter(x => setB.has(x)));

const union = new Set([...setA, ...setB]);

// 方法3:依赖第三方库

import { intersection, union } from 'lodash';

// ✅ ES2025:原生支持

setA.intersection(setB);

setA.union(setB);

setA.difference(setB);

为什么重要:

🧮 数学完整性:Set 终于有了完整的集合运算能力

⚡ 性能优化:原生实现比 JavaScript 实现更高效

🎯 代码简洁:不再需要繁琐的循环和临时数组

🌍 语言对齐:与 Python、Ruby、Swift 等语言保持一致

标准化进程:

2018-05:首次在 TC39 会议讨论

2019-01:继续讨论细节

2022-03:讨论如何扩展内置类型

2023-07:关键设计决策

2024-02:接近完成

2024-04:进入 Stage 4

生态影响:

减少依赖:不再需要 lodash、ramda 等库的集合操作

性能提升:原生 C++ 实现比 JavaScript 实现更快

代码可读性:集合操作语义更清晰

兼容性:

Duplicate Named Capture Groups

作者: Kevin Gibbons

维护者: Kevin Gibbons

TC39 会议记录 : 2024 年 4 月

说明: 允许在正则表达式的不同分支中重复使用相同的捕获组名称

解决的核心问题:匹配多种格式的文本时,无法为语义相同的部分使用相同的组名,导致代码冗余和处理复杂。

javascript

复制代码

// ❌ 之前的困境

// 方法1:使用不同的组名(语义不清)

const dateRegex = /(?[0-9]{4})-[0-9]{2}|[0-9]{2}-(?[0-9]{4})/;

const match = str.match(dateRegex);

const year = match.groups.year1 || match.groups.year2; // 需要手动合并

// 方法2:使用编号捕获组(可读性差)

const dateRegex = /([0-9]{4})-[0-9]{2}|[0-9]{2}-([0-9]{4})/;

const match = str.match(dateRegex);

const year = match[1] || match[2];

// 方法3:使用多个正则(性能差)

const regex1 = /(?[0-9]{4})-[0-9]{2}/;

const regex2 = /[0-9]{2}-(?[0-9]{4})/;

const match = str.match(regex1) || str.match(regex2);

// ✅ ES2025:允许重复命名

const dateRegex = /(?[0-9]{4})-[0-9]{2}|[0-9]{2}-(?[0-9]{4})/;

const match = str.match(dateRegex);

const year = match.groups.year; // 直接访问,自动选择匹配的分支

为什么重要:

🎯 语义一致:相同含义的捕获组使用相同名称

📝 代码简洁:无需手动合并多个组的结果

🔄 格式灵活:轻松处理多种输入格式

🌍 语言对齐:与 .NET、Python、Perl 等语言保持一致

标准化进程更新:

2022-07:达到 Stage 3

2024-04:进入 Stage 4

兼容性:

ES2026 预期新特性

预计 2026 年 7 月发布,目前已达到 Stage 4 的提案:

Uint8Array to/from Base64

作者: Kevin Gibbons

维护者: Kevin Gibbons

TC39 会议记录: 2025 年 7 月

说明: 为 Uint8Array 添加 Base64 编码和解码方法

Math.sumPrecise

作者: Kevin Gibbons

维护者: Kevin Gibbons

TC39 会议记录: 2025 年 7 月

说明: 提供精确的数值求和方法,避免浮点数累积误差

Error.isError

作者: Jordan Harband

维护者: Jordan Harband

TC39 会议记录: 2025 年 5 月

说明: 提供可靠的方法来检测一个值是否为 Error 实例

结语

授人以鱼,不如授人以渔,希望通过本文追根溯源,带领同学们走进 ECMAScript 的世界,ES 神秘代码不再神秘,ES 新特性不再彷徨。

参考资料

Ecma国际 - 维基百科,自由的百科全书

History and evolution of JavaScript

【译】ECMAScript 2021: 最终功能集确定

github.com/tc39/notes/...