this 关键字 (The this Keyword)new 运算符 (The new Operator)super 关键字 (The super Keyword)? : ) (Conditional Operator ( ? : )), )if 语句 (The if Statement)do-while 语句 (The do-while Statement)while 语句 (The while Statement)for 语句 (The for Statement)for-in、for-of 与 for-await-of 语句continue 语句 (The continue Statement)break 语句 (The break Statement)return 语句 (The return Statement)with 语句 (The with Statement)switch 语句 (The switch Statement)throw 语句 (The throw Statement)try 语句 (The try Statement)debugger 语句 (The debugger Statement)?um/p1-90`在 https://tc39.es/ecma262/ 的文档是最准确、最新的 ECMAScript 规范。它包含最近年度快照的内容,以及所有 已完成提案 —— 这些提案已经在 提案流程 中达到第四阶段 4,并已在多个实现中实现,并将被纳入下一个年度快照。历史快照可在 https://ecma-international.org/publications-and-standards/standards/ecma-262/ 找到。
本规范在 GitHub 上由 ECMAScript 社区协作开发。您可以通过以下几种方式参与本规范的制定:
更多关于本文件创建方式的信息请参阅
本 Ecma 标准定义了 ECMAScript 2026 语言。这是 ECMAScript 语言规范的第十七版。ECMAScript 基于多种最初的技术,其中最著名的是 JavaScript(Netscape)和 JScript(Microsoft)。该语言由 Brendan Eich 在 Netscape 发明,并首次出现在该公司 Navigator 2.0 浏览器中。虽然 ECMAScript 最为人熟知的是作为网页浏览器中的嵌入式语言,但它也被广泛应用于浏览器之外的场景,包括服务器和嵌入式应用程序,并且已经发展成为全球最广泛使用的通用编程语言之一。
ECMAScript 语言规范的开发始于 1996 年 11 月。该 Ecma 标准的第一版由 Ecma 大会在 1997 年 6 月通过。
该 Ecma 标准按快速通道程序提交至 ISO/IEC JTC 1,并于 1998 年 4 月获批为国际标准 ISO/IEC 16262。Ecma 大会于 1998 年 6 月批准了 ECMA-262 的第二版,以确保其与 ISO/IEC 16262 完全一致。第一版与第二版之间的更改仅为编辑性质。
标准的第三版引入了强大的正则表达式、更好的字符串处理、新的控制语句、try/catch 异常处理、更严格的错误定义、数字输出格式,以及为未来语言发展做出的细微调整。第三版由 Ecma 大会于 1999 年 12 月通过,并作为 ISO/IEC 16262:2002 于 2002 年 6 月发布。
第三版发布后,ECMAScript 在万维网环境下得到广泛采用,成为几乎所有浏览器支持的编程语言。曾有大量工作投入到 ECMAScript 第四版的开发中,但该工作最终未完成并未以第四版发布,部分内容被融入到第六版的开发中。
ECMAScript 第五版(作为 ECMA-262 第 5 版发布)规范化了已成为浏览器实现间通用的语言解释方式,并加入了自第三版发布以来出现的新特性。这些特性包括
第五版按快速通道程序提交至 ISO/IEC JTC 1,并获批为国际标准 ISO/IEC 16262:2011。ECMAScript 标准第 5.1 版包含了细微修正,与 ISO/IEC 16262:2011 的文本一致。5.1 版由 Ecma 大会于 2011 年 6 月通过。
第六版的集中开发始于 2009 年,在第五版准备发布期间。但在此之前,自 1999 年第三版发布起,已进行了大量实验和语言增强设计。实际上,第六版的完成是十五年努力的结晶。本版目标包括更好地支持大型应用、库创建,以及将 ECMAScript 作为其他语言编译目标。主要增强包括模块、类声明、词法块作用域、迭代器和生成器、异步编程的 Promise、解构模式和尾调用优化。内置库扩展以支持更多数据抽象,如 Map、Set 和二进制数值数组,并进一步支持字符串和正则表达式中的 Unicode 补充字符。内置对象也可以通过子类化进行扩展。第六版为语言和库的常规、增量性增强奠定了基础。第六版由 2015 年 6 月的大会通过。
ECMAScript 2016 是 Ecma TC39 新的年度发布节奏和开放开发流程下发布的首个 ECMAScript 版本。基础文档由 ECMAScript 2015 的源文档转换成纯文本格式,并在 GitHub 上持续开发。在本标准开发期间,提交了数百个拉取请求和问题,修复了数千个错误、编辑问题和其他改进。此外,开发了许多软件工具以支持此过程,包括 Ecmarkup、Ecmarkdown 和 Grammarkdown。ES2016 还新增了指数运算符和 Array.prototype 的 includes 方法。
ECMAScript 2017 引入了异步函数、共享内存和原子操作,以及多项语言和库的增强、错误修复和编辑更新。异步函数通过提供 Promise 返回函数的语法改善了异步编程体验。共享内存和原子操作引入了新的Object.values、Object.entries 和 Object.getOwnPropertyDescriptors。
ECMAScript 2018 引入了通过异步迭代器协议和异步生成器实现的异步迭代支持。还新增了四种正则表达式特性:dotAll 标志、命名捕获组、Unicode 属性转义和后行断言。最后还包括对象剩余和展开属性。
ECMAScript 2019 新增了几种内置函数:用于数组扁平化的 Array.prototype 上的 flat 和 flatMap,用于直接将 Object.entries 的返回值转为新对象的 Object.fromEntries,以及作为更合理命名替代的 String.prototype 上的 trimStart 和 trimEnd(替代广泛实现但未标准化的 String.prototype.trimLeft 和 trimRight)。此外还包括对语法和语义的细微更新。语法更新包括可选的 catch 绑定参数以及在字符串字面量中允许 U+2028(行分隔符)和 U+2029(段分隔符),以与 JSON 保持一致。其他更新包括要求 Array.prototype.sort 必须为稳定排序,要求 JSON.stringify 无论输入如何都返回格式正确的 UTF-8,以及明确要求 Function.prototype.toString 返回相应的原始源代码或标准占位符。
ECMAScript 2020,第 11 版,引入了字符串的 matchAll 方法,可通过全局正则表达式生成所有匹配对象的迭代器;import(),一种可动态指定异步导入模块的语法;BigInt,用于任意精度整数的新数值原语;Promise.allSettled,一种不会短路的 Promise 组合器;globalThis,一种通用访问全局 this 的方式;模块内专用的 export * as ns from 'module' 语法;for-in import.meta 对象,可包含关于模块的上下文信息;以及为“空值”(
ECMAScript 2021,第 12 版,引入了字符串的 replaceAll 方法;Promise.any,一种在输入值满足条件时短路的 Promise 组合器;AggregateError,用于同时表示多个错误的新错误类型;逻辑赋值运算符(??=, &&=, ||=);WeakRef,用于引用目标对象但不阻止其被垃圾回收,以及 FinalizationRegistry,用于注册和注销在目标对象被垃圾回收时执行的清理操作;数字字面量分隔符(如 1_000);并且 Array.prototype.sort 更加精确,减少了实现定义排序结果的情况。
ECMAScript 2022,第 13 版,引入了顶层 await,允许在模块顶层使用该关键字;新增类元素:公有和私有实例字段、静态字段、私有实例方法和访问器、私有静态方法和访问器;类中的静态块,用于每个类的初始化;#x in obj 语法,用于检测对象上的私有字段是否存在;正则表达式匹配索引(通过 /d 标志),可提供匹配子字符串的起止索引;错误对象的 cause 属性,可用于记录错误因果链;字符串、数组和 at 方法,实现相对索引;以及 Object.hasOwn,作为更方便的 Object.prototype.hasOwnProperty 替代方案。
ECMAScript 2023,第 14 版,在 Array.prototype 和 TypedArray.prototype 上新增了 toSorted、toReversed、with、findLast 和 findLastIndex 方法,并在 Array.prototype 上新增了 toSpliced 方法;支持文件开头的 #! 注释,以更好地支持可执行 ECMAScript 文件;允许在弱集合中使用大多数 Symbol 作为键。
ECMAScript 2024,第 15 版,增加了 ArrayBuffer 和 SharedArrayBuffer 的动态调整大小和转移功能;新增了用于处理字符串集合的高级特性的新正则表达式 /v 标志;引入了便捷构造 Promise 的 Promise.withResolvers 方法,数据聚合的 Object.groupBy 和 Map.groupBy 方法,异步等待共享内存变更的 Atomics.waitAsync 方法,以及用于检测和保证字符串仅包含格式正确 Unicode 的 String.prototype.isWellFormed 和 String.prototype.toWellFormed 方法。
ECMAScript 2025,第 16 版,新增了带有相关静态方法和原型方法的全局 Iterator,用于迭代器操作;为 Set.prototype 增加了常用集合操作方法;支持导入 JSON 模块,以及声明导入模块属性的语法;新增了用于安全处理字符串的 RegExp.escape 方法;支持在正则表达式中内联启用和禁用修饰符标志的语法;新增了用于处理可能返回 Promise 或非 Promise 的函数并确保返回值始终是 Promise 的 Promise.try 方法;并新增了新的 Float16Array 类型数组及相关的 DataView.prototype.getFloat16、DataView.prototype.setFloat16 和 Math.f16round 方法。
有数十位代表众多机构的个人在 Ecma TC39 中为本版及以往版本的开发做出了重要贡献。此外,支持 TC39 ECMAScript 工作的社区也日益活跃。该社区审查了大量草案,提交了成千上万个错误报告,进行了实现实验,贡献了测试套件,并向全球开发者介绍 ECMAScript。遗憾的是,无法逐一列举和感谢每一位做出贡献的个人和机构。
Allen Wirfs-Brock
ECMA-262,第 6 版项目编辑
Brian Terlson
ECMA-262,第 7–10 版项目编辑
Jordan Harband
ECMA-262,第 10–12 版项目编辑
Shu-yu Guo
ECMA-262,第 12–16 版项目编辑
Michael Ficarra
ECMA-262,第 12–16 版项目编辑
Kevin Gibbons
ECMA-262,第 12–16 版项目编辑