ECMAScript 按类别分类(ES2015~最新)
本文按 语言特性类别 归纳,便于查阅与对照梳理。同一 API 可能跨多个版本迭代,括号内标注大致引入版本;具体以 TC39 Finished Proposals 与 MDN 为准。
命名说明:日常说的「ES6」多指 ES2015;此后每年 6 月发布 ES2016、ES2017…。下文统称 现代 JS / ES2015+,不单指 2015。
一、语法层:变量、解构、展开与字面量
1. 块级作用域声明(ES2015)
| 特性 | 说明 |
|---|---|
let | 块级作用域;不存在同一块内重复声明;存在暂时性死区(TDZ) |
const | 块级常量绑定;必须初始化;对对象/数组保存的是引用不可变(内容仍可改) |
2. 解构赋值(ES2015)
- 数组解构:
const [a, b = 1, ...rest] = arr - 对象解构:
const { x, y: rename, z = 3 } = obj - 嵌套解构、默认值、与函数参数结合(见下文)
3. 剩余与展开(ES2015)
| 运算符 | 场景 |
|---|---|
剩余 ...rest | 函数参数、数组/对象解构末尾收集剩余项 |
展开 ...iterable | 数组字面量、函数调用参数列表 |
对象展开 { ...obj } | ES2018,浅拷贝与合并对象 |
4. 模板字面量(ES2015)
- 反引号
`、多行字符串、${expr}插值 - 标签模板:
tag`hello ${x}`→ 调用函数tag(strings, ...values)
5. 简洁语法(ES2015)
- 对象方法简写
{ foo() {} }、属性名简写{ a } - 计算属性名:
{ [key]: v }
6. 可选链与空值合并(ES2020)
| 运算符 | 含义 |
|---|---|
?. | 短路访问:obj?.a?.b、arr?.[0]、fn?.() |
?? | 仅当左侧为 null 或 undefined 时取右侧(与 || 区分) |
7. 逻辑赋值(ES2021)
&&=、||=、??=:读改写运算并赋回同一引用。
8. 数字分隔符(ES2021)
1_000_000、0xFF_FF,提升可读性(不影响值)。
9. 类相关语法(ES2015 + 后续)
- ES2015:
class、extends、super、静态方法static - ES2022:私有字段/方法
#field、#method();静态块static { } - ES2022 / ES2023:公有类字段、私有类字段、静态私有(依提案阶段与引擎支持)
10. 装饰器 Decorators(ES2024 纳入标准)
类、方法、字段、getter/setter、访问器的 @decorator 语法(需构建工具或新版引擎支持)。
二、函数
1. 默认参数、剩余参数(ES2015)
function f(a = 1, ...rest) {}- 默认参数后的形参无自身默认值时,对
arguments行为需注意;默认参数存在 TDZ。
2. function.name / function.length(ES2015 规范化)
length:首个默认参数之前的形参个数。name:推断名称(含赋值给变量的函数表达式等)。
3. 箭头函数(ES2015)
- 无自身
this/arguments/super/new.target,继承外层词法环境。 - 不能作构造函数(无
prototype、不可用new)。 - 简洁返回:
x => x * 2
4. 尾后逗号(ES2017)
函数调用、函数声明、数组、对象字面量末尾逗号合法,便于 Git diff。
三、对象
1. 静态方法(Object 命名空间)(节选)
| 方法 | 版本 | 作用 |
|---|---|---|
Object.assign(target, ...sources) | ES2015 | 浅拷贝可枚举自有属性到 target |
Object.is(a, b) | ES2015 | 同值判断(NaN 与 +0/-0 行为与 === 不同) |
Object.keys / values / entries | ES2015 / ES2017 | 枚举键、值、键值对数组 |
Object.getOwnPropertyDescriptors(obj) | ES2018 | 用于配合 Object.defineProperties 做拷贝 |
Object.fromEntries(iterable) | ES2019 | [[k,v],…] → 对象,与 entries 互逆 |
Object.hasOwn(obj, key) | ES2022 | 建议替代 Object.prototype.hasOwnProperty.call |
2. __proto__ 与原型(ES2015)
- 标准化
Object.getPrototypeOf/setPrototypeOf为主流用法。
四、数组与类数组
1. 静态方法
| 方法 | 版本 | 说明 |
|---|---|---|
Array.from(arrayLike[, mapFn[, thisArg]]) | ES2015 | 类数组/可迭代 → 真数组;可映射 |
Array.of(...items) | ES2015 | 避免 Array(7) 与 Array(7,8) 歧义 |
2. 实例方法(变更原数组 / 返回新数组)
会修改原数组(节选):sort、splice、reverse、fill、copyWithin 等。
ES2015+ 常用新增:
| 方法 | 版本 | 说明 |
|---|---|---|
find / findIndex | ES2015 | 条件查找 / 下标 |
fill / copyWithin | ES2015 | 填充 / 区内复制 |
includes | ES2016 | NaN 可正确判断 |
flat / flatMap | ES2019 | 扁平化 / 映射后扁平一层 |
findLast / findLastIndex | ES2023 | 从后往前查找 |
ES2023 不可变语义(返回新数组):
| 方法 | 说明 |
|---|---|
toReversed() | 不修改原数组的反转 |
toSorted(compareFn?) | 不修改原数组的排序 |
toSpliced(start, deleteCount, ...items) | 不修改原数组的 splice 语义 |
with(index, value) | 指定下标替换为新值的新数组 |
3. 迭代方法(ES2015)
keys()、values()、entries()返回 迭代器(配合for...of)。
4. Array.prototype.sort 说明
sort早已存在,ES2015 起规范要求排序算法稳定(由实现保证);不可变排序请用 ES2023 的toSorted。
5. Array.fromAsync(ES2024)
异步迭代或可迭代异步源 → Promise<数组>。
五、字符串
1. ES2015
- Unicode 码点:
codePointAt、String.fromCodePoint includes、startsWith、endsWith、repeatnormalize(Unicode 正规化)
2. 后续版本(节选)
| 方法 | 版本 |
|---|---|
padStart / padEnd | ES2017 |
trimStart / trimEnd(别名 trimLeft / trimRight) | ES2019 |
matchAll(返回迭代器,配合 g 标志) | ES2020 |
replaceAll | ES2021 |
at(支持负数下标) | ES2022 |
3. 内置对象 String.raw(ES2015)
标签模板中取得原始字符串片段。
六、数值、Math 与 BigInt
1. Number 扩展(ES2015)
Number.isFinite、Number.isNaN、Number.isInteger、Number.EPSILON、Number.MAX_SAFE_INTEGER、Number.MIN_SAFE_INTEGER、Number.isSafeInteger
2. Math 新增(ES2015 等)
trunc、sign、cbrt、hypot、imul、clz32 等一组数学工具。
3. BigInt(ES2020)
任意精度整数:123n;与 Number 混算需显式转换。
七、Symbol
1. 基本(ES2015)
Symbol()、Symbol.for/Symbol.keyFor- 对象唯一属性键、避免名称冲突
2. Well-Known Symbols(节选)
Symbol.iterator、Symbol.toStringTag、Symbol.asyncIterator(ES2018)等,用于协议挂载。
3. Symbol.prototype.description(ES2019)
只读描述字符串。
八、集合类型:Map、Set、WeakMap、WeakSet
1. Map / Set(ES2015)
- 任意类型键(
Map)、值唯一(Set) - 迭代顺序为插入顺序;具备
size、clear、迭代器协议
2. WeakMap / WeakSet(ES2015)
- 弱引用键(对象);不可枚举全部键;适合元数据、私有实现细节
3. 实例方法扩展(后续)
如 Set 上的集合运算在 ES2025 提案中补充 union / intersection / difference 等(以引擎支持为准)。
九、迭代协议、生成器与 for...of
1. 协议(ES2015)
- 可迭代协议:
Symbol.iterator - 迭代器协议:
next()返回{ value, done }
2. 生成器(ES2015)
function*、yield、yield*;可用于惰性序列、简化异步(历史上也曾与协程风格结合)。
3. for...of(ES2015)
遍历可迭代对象(默认不含普通对象,对象需配合 Object.keys 等)。
4. 异步迭代(ES2018)
Symbol.asyncIteratorfor await...of:遍历异步可迭代源
十、Promise 与异步流程
1. Promise(ES2015)
Promise.resolve / reject、then、catch、all、race
2. 静态方法扩展
| 方法 | 版本 | 行为摘要 |
|---|---|---|
finally | ES2018 | 无论 fulfilled / rejected 都执行 |
allSettled | ES2020 | 全部落定,含理由 |
any | ES2021 | 任一成功;全失败则 AggregateError |
withResolvers | ES2024 | 返回 { promise, resolve, reject } |
3. async / await(ES2017)
基于 Promise 的同步写法;await 可接 Thenable。
4. 顶层 await(ES2022)
模块顶层可直接 await,用于加载依赖或异步初始化。
5. import() 动态导入(ES2020)
返回 Promise,用于代码分割与按需加载。
十一、模块:import / export(ES2015)
- 静态:编译期结构、
export/import、* as、default - 动态:
import('./mod.js') - JSON 模块、Import Attributes 等由宿主与后续标准扩展(需构建链配置)
十二、Proxy 与 Reflect(ES2015)
| API | 作用 |
|---|---|
Proxy | 拦截对象操作(读写属性、函数调用、in、delete 等) |
Reflect | 与 Handler trap 一一对应的默认行为封装,返回布尔/结果便于处理 |
常用于响应式框架、不可变代理、API 兼容层。
十三、正则表达式
1. ES2015
u(Unicode)、y(sticky)flags属性、RegExp构造可写 flags
2. ES2018
- 命名捕获组
(?<name>...) - dotAll
s:.匹配换行 - 后行断言
(?<=)、(?<!)
3. ES2019 / ES2020
String.prototype.matchAll与正则迭代String.prototype.replace结合命名组替换
4. ES2024
v标志(unicodeSets):Unicode 属性类、集合运算更完整(与u二选一使用场景见 MDN)
十四、globalThis(ES2020)
在浏览器、Node、Worker 等环境统一获取全局对象。
十五、JSON
- ES2019:JSON 作为 ECMA-262 的子规范明确纳入(语法层面约束更一致);常用仍是
JSON.parse/JSON.stringify(方法本身更早即有)。
十六、错误与 Error.prototype.cause(ES2022)
链式错误原因:throw new Error('wrap', { cause: originalError }),便于排查异步/封装层次。
十七、分组归约:Object.groupBy / Map.groupBy(ES2024)
按回调返回值分组;Map 版本适用于对象键非字符串场景。
十八、国际化 Intl(演进多年)
非单次 ES 版本一次性引入:Intl.DateTimeFormat、Intl.NumberFormat、Intl.RelativeTimeFormat(ES2018)、Intl.ListFormat、Intl.DisplayNames 等随 ECMA-402 迭代。常见要点:本地化格式化与时区。
十九、与「按时间线」文档的配合使用
- 查「哪一年加了什么」:见同目录 [01、ES6 按时间线分类](./01、ES6 按时间线分类.md)。
- 查「某一类 API 有哪些」:以本文类别为准,并按需跳转 MDN / 提案原文。
附录:文档修正说明
Object.fromEntries:作用是把[ [key, val], ... ]转成对象,不是「返回键值对」。Array.prototype.sort:不是 ES6 才新增的方法;不可变排序请使用toSorted(ES2023)。- 装饰器:早期多为 TS / Babel 实验语法;ES2024 起有标准语法路径,实际项目需看 TS 版本与构建配置。
