ECMAScript 历代版本

欧洲计算机制造商协会(European Computer Manufacturers Association)或简称 ECMA. ECMA走向全球后,在1994 年更名为:Ecma International。其商标“ECMA”由于历史原因被保留了下来,沿用至今。
ECMA-262是一种规范(官网中可以查到各个版本的PDF提案),自然会有满足这种规范的具体的语言被创造出来。最著名的就是JavaScript
(现在商标属于Oracle),在1995年由Netscape公司的Brendan Eich,在Netscape导航者浏览器上首次设计实现而成。因为Netscape与Sun合作,Netscape管理层希望它外观看起来像Java,因此取名为JavaScript。但实际上它的语法风格与Self及Scheme较为接近。其设计思路如下:

  • 借鉴 C 语言的基本语法。
  • 借鉴 Java 语言的数据类型和内存管理。
  • 借鉴 Scheme 语言,将函数提升到“第一等公民”(first class)的地位。
  • 借鉴 Self 语言,使用基于原型(prototype)的继承机制。

ECMAScript 各版本

  • ECMAScript 1.0 (1997):第一个正式标准,规范化了 JavaScript 的核心语言。

  • ECMAScript 3.0 (1999):该版本为语言带来了正则表达式、try/catch 异常处理以及更多的核心改进。

  • ECMAScript 5.0 (2009):引入了 strict mode(严格模式),并添加了许多数组方法(如 forEach、map、filter 等)。这次更新被认为是 JavaScript 现代化的重要一步。

  • ECMAScript 6 (ES2015):这是 ECMAScript 发展中的里程碑式版本,增加了 let 和 const 变量声明、类和模块系统、箭头函数、解构赋值、模板字符串、Promise、Symbol、迭代器和生成器等新特性。

  • ECMAScript 7 (ES2016):主要是增加了两个新特性:Array.prototype.include和取幂运算符。

  • ECMAScript 8 (ES2017):主要变化包括:Object.values/Object.entries、字符串填充、Object.getOwnPropertyDescriptor、尾随逗号、异步函数、共享内存和原子,等。

  • ECMAScript 9 (ES2018):ECMAScript 2018 主要包含内容:

    • 异步迭代器:原生支持在 JavaScript 中对异步获取的数据做迭代。
    • Object Rest/Spread Properties
    • Promise.prototype.finally
    • Template Literal(模板字面量):取消 Escape-Sequenzen 限制
    • 正则表达式:
      • 支持 s (dotAll) 模式
      • Unicode 属性转义(Property Escape)
      • 支持后行断言(Lookbehind Assertions)
      • 命名捕获组(named capture group)
  • ECMAScript 10 (ES2019):

    • Array.prototype.flat() 和 Array.prototype.flatMap()
    • Object.fromEntries()
    • String.prototype.trimStart() 和 String.prototype.trimEnd()
    • Array.prototype.sort() 改进
    • Symbol.prototype.description
    • Function.prototype.toString() 的改进
    • JSON.prototype.{stringify, parse} 的改进
      • JSON.stringify() 现在会忽略 undefined、symbol、函数 等值。
      • JSON.parse() 对 NaN、Infinity 和 -Infinity 的处理变得更加严格,报错而不是返回这些值。
    • RegExp.prototype.flags. RegExp.prototype.flags 属性返回正则表达式的标志(如 g, i, m 等),这是一个只读的属性,简化了获取正则标志的方式。
    • Optional Catch Binding (可选的 catch 绑定). 在 ES10 中,try…catch 语句中的 catch 变量现在是可选的,可以不指定错误对象变量。
    • Well-formed JSON.stringify() 的改进. ES10 对 JSON.stringify() 进行了改进,确保序列化结果是符合 JSON 格式的,修复了一些潜在的问题。
  • ECMAScript 11 (ES2020):

    • Optional Chaining(可选链操作符 ?.)
    • Nullish Coalescing Operator(空值合并操作符 ??)
    • BigInt
    • Promise.allSettled()
    • globalThis
    • String.prototype.matchAll()
    • Array.prototype.sort() 的稳定性
    • 模块化的顶层 await
    • Import.meta
    • 模块内的顶层 await 和新的 import 机制