Draft ECMA-262 / June 25, 2026

ECMAScript® 2027 语言规范

关于本规范

位于 https://tc39.es/ecma262/ 的文档是最准确且最新的 ECMAScript 规范。它包含最新年度快照的内容,以及任何 已完成的提案 —— 即在 提案流程 中已达到 Stage 4,因而已在多个实现中实现并将被纳入下一年度快照的提案。历史快照可在 https://ecma-international.org/publications-and-standards/standards/ecma-262/ 获取。

本文档以单页多页形式提供。

参与本规范

本规范在 GitHub 上借助 ECMAScript 社区的帮助进行开发。有多种方式可以参与本规范的开发:

有关本文档如何创建的更多信息,请参阅附录说明

引言

本 Ecma 标准定义了 ECMAScript 2027 语言。它是 ECMAScript 语言规范的第十八版。ECMAScript 基于若干源头技术,其中最著名的是 JavaScript(Netscape)和 JScript(Microsoft)。该语言由 Netscape 的 Brendan Eich 发明,并首次出现在该公司的 Navigator 2.0 浏览器中。尽管它最广为人知的是嵌入在 Web 浏览器中的语言,但也已被广泛采用在浏览器之外使用,包括服务器和嵌入式应用程序,并已成长为世界上使用最广泛的通用编程语言之一。

ECMAScript 语言规范的开发始于 1996 年 11 月。本 Ecma 标准的第一版由 1997 年 6 月的 Ecma 大会采纳。

该 Ecma 标准根据快速通道程序提交给 ISO/IEC JTC 1 采纳,并于 1998 年 4 月被批准为国际标准 ISO/IEC 16262。1998 年 6 月的 Ecma 大会批准了 ECMA-262 第二版,以使其与 ISO/IEC 16262 完全保持一致。第一版与第二版之间的变更属于编辑性质。

该标准第三版引入了强大的正则表达式、更好的字符串处理、新的控制语句、try/catch 异常处理、对错误更严格的定义、数值输出格式化以及为未来语言发展预留的若干小改动。ECMAScript 标准第三版由 1999 年 12 月的 Ecma 大会采纳,并于 2002 年 6 月以 ISO/IEC 16262:2002 发布。

第三版发布后,ECMAScript 随万维网一起获得了大规模采用,并已成为基本上所有 Web 浏览器都支持的编程语言。曾对 ECMAScript 第四版进行过大量开发工作。然而,该工作并未完成,也未作为 ECMAScript 第四版发布,但其中一部分被纳入了第六版的开发。

ECMAScript 第五版(以 ECMA-262 第 5th 版发布)将浏览器实现中已变得常见的对语言规范的事实解释规范化,并增加了对自第三版发布以来出现的新特性的支持。这些特性包括访问器属性、对象的反射式创建与检查、对属性属性的程序控制、额外的数组操作函数、对 JSON 对象编码格式的支持,以及提供增强错误检查和程序安全性的严格模式。第五版由 2009 年 12 月的 Ecma 大会采纳。

第五版根据快速通道程序提交给 ISO/IEC JTC 1 采纳,并被批准为国际标准 ISO/IEC 16262:2011。ECMAScript 标准 5.1 版纳入了少量修正,其文本与 ISO/IEC 16262:2011 相同。5.1 版由 2011 年 6 月的 Ecma 大会采纳。

第六版的集中开发始于 2009 年,当时第五版正在准备发布。不过,在此之前已经有重要的实验和语言增强设计工作,其时间可追溯到 1999 年第三版发布之时。从非常真实的意义上说,第六版的完成是十五年努力的结晶。该版本的目标包括为大型应用程序、库创建以及将 ECMAScript 用作其他语言的编译目标提供更好的支持。其若干主要增强包括模块、类声明、词法块级作用域、迭代器和生成器、用于异步编程的 Promise、解构模式以及正确的尾调用。ECMAScript 内置库得到扩展,以支持额外的数据抽象,包括映射、集合和二进制数值数组,以及对字符串和正则表达式中 Unicode 补充字符的额外支持。内置对象也通过子类化变得可扩展。第六版为常规的、渐进式的语言和库增强奠定了基础。第六版由 2015 年 6 月的大会采纳。

ECMAScript 2016 是在 Ecma TC39 新的年度发布节奏和开放开发流程下发布的第一个 ECMAScript 版本。一个纯文本源文档基于 ECMAScript 2015 源文档构建,用作完全在 GitHub 上进一步开发的基础。在这一标准一年的开发过程中,提交了数百个拉取请求和议题,代表着数千项缺陷修复、编辑修复和其他改进。此外,还开发了大量软件工具以辅助这项工作,包括 Ecmarkup、Ecmarkdown 和 Grammarkdown。ES2016 还包含了对新的幂运算符的支持,并向 Array.prototype 添加了一个名为 includes 的新方法。

ECMAScript 2017 引入了 Async Functions、Shared Memory 和 Atomics,以及较小的语言和库增强、缺陷修复和编辑更新。Async 函数通过为返回 Promise 的函数提供语法,改善了异步编程体验。Shared Memory 和 Atomics 引入了一种新的内存模型,允许多代理程序使用原子操作进行通信,这些原子操作即使在并行 CPU 上也能确保定义明确的执行顺序。它还包含了 Object 上的新静态方法:Object.valuesObject.entriesObject.getOwnPropertyDescriptors

ECMAScript 2018 通过 async iterator 协议和 async generators 引入了对异步迭代的支持。它还包含四项新的正则表达式特性:dotAll 标志、命名捕获组、Unicode 属性转义和后行断言。最后,它还包含了对象剩余属性和展开属性。

ECMAScript 2019 引入了若干新的内置函数:Array.prototype 上用于扁平化数组的 flatflatMap、用于直接将 Object.entries 的返回值转换为新 Object 的 Object.fromEntries,以及 String.prototype 上作为已广泛实现但非标准的 String.prototype.trimLefttrimRight 内置函数更好命名替代项的 trimStarttrimEnd。此外,它还包含了若干语法和语义上的小更新。更新后的语法包括可选的 catch 绑定参数,以及允许字符串字面量中出现 U+2028(LINE SEPARATOR)和 U+2029(PARAGRAPH SEPARATOR),以与 JSON 对齐。其他更新包括要求 Array.prototype.sort 是稳定排序、要求 JSON.stringify 无论输入如何都返回格式良好的 UTF-8,以及通过要求 Function.prototype.toString 要么返回对应的原始源文本,要么返回标准占位符来澄清该方法。

ECMAScript 2020,第 11th 版,引入了 Strings 的 matchAll 方法,用于为全局正则表达式生成的所有匹配对象产生一个迭代器;import(),一种使用动态说明符异步导入 Modules 的语法;BigInt,一种用于处理任意精度整数的新数字原始值;Promise.allSettled,一种不会短路的新 Promise 组合器;globalThis,一种访问全局 this 值的通用方式;专用于在模块中使用的 export * as ns from 'module' 语法;对 for-in 枚举顺序的标准化增强;import.meta,一种在 Modules 中可用、由宿主填充且可包含关于 Module 的上下文信息的对象;并新增两项语法特性以改善处理“nullish”值(undefinednull)的体验:空值合并,一种值选择运算符;以及可选链,一种属性访问和函数调用运算符,当要访问/调用的值为 nullish 时会短路。

ECMAScript 2021,第 12th 版,引入了 Strings 的 replaceAll 方法;Promise.any,一种当输入值 fulfilled 时短路的 Promise 组合器;AggregateError,一种一次表示多个错误的新 Error 类型;逻辑赋值运算符(??=&&=||=);WeakRef,用于在不阻止目标对象被垃圾回收的情况下引用目标对象;以及 FinalizationRegistry,用于管理当目标对象被垃圾回收时执行的清理操作的注册和注销;数值字面量分隔符(1_000);并使 Array.prototype.sort 更精确,减少会导致实现定义排序顺序的情况数量。

ECMAScript 2022,第 13th 版,引入了顶层 await,允许在模块的顶层使用该关键字;新的类元素:公共和私有实例字段、公共和私有静态字段、私有实例方法和访问器,以及私有静态方法和访问器;类内部的静态块,用于执行按类的求值初始化;#x in obj 语法,用于测试对象上是否存在私有字段;通过 /d 标志提供的正则表达式匹配索引,它为匹配的子字符串提供开始和结束索引;Error 对象上的 cause 属性,可用于在错误中记录因果链;Strings、Arrays 和 TypedArraysat 方法,允许相对索引;以及 Object.hasOwn,作为 Object.prototype.hasOwnProperty 的便捷替代项。

ECMAScript 2023,第 14th 版,引入了 Array.prototypeTypedArray.prototype 上的 toSortedtoReversedwithfindLastfindLastIndex 方法,以及 Array.prototype 上的 toSpliced 方法;增加了对文件开头 #! 注释的支持,以更好地便于可执行 ECMAScript 文件;并允许将大多数 Symbols 用作弱集合中的键。

ECMAScript 2024,第 15th 版,添加了用于调整和转移 ArrayBuffers 与 SharedArrayBuffers 的设施;添加了新的 RegExp /v 标志,用于创建具备更高级特性、可处理字符串集合的 RegExps;并引入了用于构造 Promises 的便捷方法 Promise.withResolvers,用于聚合数据的 Object.groupByMap.groupBy 方法,用于异步等待共享内存变化的 Atomics.waitAsync 方法,以及用于检查并确保字符串只包含格式良好 Unicode 的 String.prototype.isWellFormedString.prototype.toWellFormed 方法。

ECMAScript 2025,第 16th 版,添加了新的 Iterator 全局对象及其相关静态方法和原型方法,用于处理迭代器;向 Set.prototype 添加了用于执行常见 Set 操作的方法;增加了对导入 JSON modules 以及声明导入模块属性的语法的支持;添加了 RegExp.escape 方法,用于转义字符串以便安全地用于正则表达式;添加了用于在正则表达式内联启用和禁用修饰符标志的语法;添加了 Promise.try 方法,用于调用可能返回也可能不返回 Promise 的函数,并确保结果始终是 Promise;并添加了新的 Float16Array TypedArray 种类,以及相关的 DataView.prototype.getFloat16DataView.prototype.setFloat16Math.f16round 方法。

ECMAScript 2026,第 17th 版,添加了 Math.sumPrecise,用于对不同量级的 Numbers 可迭代对象求和,同时最小化精度损失;Iterator.concat,用于串接迭代器;Array.fromAsync,用于从 async iterables 和其他异步源构造 Arrays;Error.isError,用于识别错误对象;向 Map.prototypeWeakMap.prototype 添加了方法,用于在键尚不存在时提供检索期间使用的默认值;向 Uint8Array 添加了方法,用于转换为十六进制和 base64 编码二进制数据的 Strings 以及从这些 Strings 转换回来;向 JSON.parse revivers 添加了一个参数,用于访问匹配的 JSON 源片段;以及 JSON.rawJSON,用于对原始值的 JSON.stringify 输出进行精细控制。

来自许多组织的数十名个人对本版以及之前各版在 Ecma TC39 内的发展作出了非常重要的贡献。此外,一个充满活力的社区已经形成,支持 TC39 的 ECMAScript 工作。该社区审阅了大量草案,提交了数千份缺陷报告,开展了实现实验,贡献了测试套件,并向全球开发者社区普及了 ECMAScript。遗憾的是,要识别并致谢每一位为此作出贡献的个人和组织是不可能的。

Allen Wirfs-Brock
ECMA-262,第 6th 版项目编辑

Brian Terlson
ECMA-262,第 7th 至第 10th 版项目编辑

Jordan Harband
ECMA-262,第 10th 至第 12th 版项目编辑

Kevin Gibbons
ECMA-262,第 12th 至第 17th 版项目编辑

Shu-yu Guo
ECMA-262,第 12th 至第 18th 版项目编辑

Michael Ficarra
ECMA-262,第 12th 至第 18th 版项目编辑

Richard Gibson
ECMA-262,第 18th 版项目编辑

Ron Buckton
ECMA-262,第 18th 版项目编辑

Nicolò Ribaudo
ECMA-262,第 18th 版项目编辑

Linus Groh
ECMA-262,第 18th 版项目编辑