ES6 到 ESNext 各年度的新增语法特性
以下是 ES6(ES2015)到 ESNext 各年度 ECMAScript 标准新增的主要语法特性总结,按年份分类:
ES6 / ES2015
JavaScript 的重大更新,引入了现代编程的核心特性。新增语法:
• let
/ const
(块级作用域变量) • 箭头函数(() => {}
) • 模板字符串(Hello ${name}
) • 解构赋值(const { a, b } = obj;
) • 默认参数(function foo(a = 1) {}
) • Rest/Spread 操作符(...args
) • 类(class
) • 模块化(import
/ export
) • Promise
(异步处理) • Symbol
(唯一值) • for...of
循环 • 生成器(function*
和 yield
) • Proxy / Reflect(元编程) • Object.assign()
ES2016
小版本更新,仅新增 2 个特性。新增语法:
- 数组的
includes()
方法 [1, 2, 3].includes(2); // true - 指数运算符(
**
) 2 ** 3; // 8(替代 Math.pow(2, 3))
ES2017
新增语法:
async
/await
(异步终极解决方案) async function fetchData() { const res = await fetch(url); }Object.values()
/Object.entries()
Object.values({ a: 1, b: 2 }); // [1, 2]- 字符串填充方法(
padStart()
/padEnd()
) '5'.padStart(2, '0'); // "05" - 函数参数尾逗号(
function foo(a, b,) {}
)
ES2018
新增语法:
- Rest/Spread 属性(对象解构) const { a, ...rest } = { a: 1, b: 2 };
- 异步迭代器(
for await...of
) for await (const chunk of stream) {} Promise.finally()
fetch(url).finally(() => cleanup());- 正则表达式改进:• 命名捕获组(
(?<name>pattern)
)•dotAll
模式(/s
标志)• 后行断言((?<=...)
/(?<!...)
)
ES2019
新增语法:
Array.flat()
/Array.flatMap()
[1, [2]].flat(); // [1, 2]Object.fromEntries()
Object.fromEntries([['a', 1]]); //- 字符串的
trimStart()
/trimEnd()
try...catch
可省略绑定(catch {}
)Symbol.description
Symbol('foo').description; // "foo"
ES2020
新增语法:
- 可选链(
?.
) obj?.prop?.method?.(); - 空值合并(
??
) const value = input ?? 'default'; Promise.allSettled()
Promise.allSettled([promise1, promise2]);BigInt
(大整数) 123n + 456n; // 579n- 动态导入(
import()
) const module = await import('./module.js');
ES2021
新增语法:
- 逻辑赋值运算符(
&&=
/||=
/??=
) a ||= b; // 等价于 a = a || b String.replaceAll()
'aabb'.replaceAll('a', 'c'); // "ccbb"Promise.any()
Promise.any([promise1, promise2]); // 返回第一个成功的- 数字分隔符(
_
) 1_000_000; // 更易读
ES2022
新增语法:
- 类的私有字段(
#
) class Foo await
顶层使用(模块中) const data = await fetch(url); // 模块顶层直接使用Array.at()
[1, 2, 3].at(-1); // 3(负索引)Object.hasOwn()
Object.hasOwn(obj, 'key'); // 替代 obj.hasOwnProperty- 静态类块(
static {}
) class Foo { static { initialize(); } }
ES2023
新增语法:
Array.findLast()
/Array.findLastIndex()
[1, 2, 3].findLast(x => x > 1); // 3Hashbang
语法标准化 #!/usr/bin/env node
ESNext(未来提案)
实验性特性(可能在未来版本中发布):
- 装饰器(Decorators)(
@decorator
) - Record & Tuple(不可变数据结构) #{ a: 1 } 和 #[1, 2, 3]
- 管道操作符(Pipeline Operator) value |> foo |> bar;
总结
| ES6 | let/const、箭头函数、类、模块化 | | ES2017 | async/await、Object.entries() | | ES2020 | 可选链(?.)、空值合并(??) | | ES2022 | 私有字段(#)、顶层 await | | ESNext | 装饰器、Record & Tuple(提案中) |
建议根据目标运行环境选择支持的版本(可通过 Can I Use 检查兼容性)。