Skip to content

参考

基于现代 JavaScript(ES2025 · 核于 2026-06)

速查

  • 生成器:function* + yield;调用得生成器对象,next() 跑到下一个 yieldyield* 委托、next(v) / return() / throw() 双向与外控
  • 自定义迭代器:给对象写 *[Symbol.iterator]();可复用容器要「每次新建生成器」才能重复遍历
  • 异步:async function* + for await...of(ES2018);Array.fromAsync(ES2024)物化有限异步序列
  • Proxy:new Proxy(target, handler)13 个陷阱;没写的透传;多数陷阱返回 boolean;受不变量约束
  • Reflect:与陷阱一一对应的默认实现;陷阱里 Reflect.*(...) 转发,get/setreceiverthis
  • well-known symbols:iterator / asyncIterator / toPrimitive / toStringTag / hasInstance / dispose
  • 资源管理(ES2026·Stage 4·非 Baseline):using[Symbol.dispose]await using[Symbol.asyncDispose]、手动 DisposableStack
  • WeakRef / FinalizationRegistry(ES2021):弱引用 + GC 回调,非确定、尽力而为,不可托付关键清理

生成器方法速查

方法作用
gen.next(v)恢复执行到下一个 yieldv 成为当前 yield 表达式的值(首次调用的 v 被忽略)
gen.return(v)提前结束,返回 { value: v, done: true },触发 try...finally
gen.throw(e)在当前 yield 暂停点抛出 e,可被生成器内 try...catch 接住
yield x产出 x 并暂停
yield* iterable委托:逐个透传另一个可迭代对象 / 生成器的产出

迭代协议速查

协议关键方法用于
可迭代(iterable)[Symbol.iterator]() → 迭代器for...of / ... / 解构
迭代器(iterator)next(){ value, done }被上面驱动
异步可迭代[Symbol.asyncIterator]() → 异步迭代器for await...of
异步迭代器next()Promise<{ value, done }>for await...of 驱动

Proxy 13 个陷阱 ↔ Reflect ↔ 触发操作

陷阱 / Reflect 方法内部方法触发它的操作
get(t, k, recv)[[Get]]obj.k / obj[k]
set(t, k, v, recv)[[Set]]obj.k = v
has(t, k)[[HasProperty]]k in obj
deleteProperty(t, k)[[Delete]]delete obj.k
ownKeys(t)[[OwnPropertyKeys]]Object.keys / getOwnPropertyNames / for...in
getOwnPropertyDescriptor(t, k)[[GetOwnProperty]]Object.getOwnPropertyDescriptor
defineProperty(t, k, desc)[[DefineOwnProperty]]Object.defineProperty / 类字段
getPrototypeOf(t)[[GetPrototypeOf]]Object.getPrototypeOf / instanceof
setPrototypeOf(t, proto)[[SetPrototypeOf]]Object.setPrototypeOf
isExtensible(t)[[IsExtensible]]Object.isExtensible
preventExtensions(t)[[PreventExtensions]]Object.preventExtensions
apply(t, thisArg, args)[[Call]]proxy(...)
construct(t, args, newTarget)[[Construct]]new proxy(...)

返回值:set / deleteProperty / defineProperty / has / preventExtensions / setPrototypeOf 须返回 boolean;get 返回任意值;apply / construct 返回调用结果;ownKeys 返回键数组;getOwnPropertyDescriptor 返回描述符或 undefined

Reflect 优于旧写法的点

任务Reflect旧写法优势
this 控制地读Reflect.get(o, k, recv)o[k]唯一能控制 getter 的 thisreceiver
安全删属性Reflect.deleteProperty(o, k)delete o[k]返回 boolean,不抛错
安全定义属性Reflect.defineProperty(o, k, d)Object.defineProperty返回 boolean,不抛错
自定义 new.target 构造Reflect.construct(F, args, NT)new F(...)唯一能指定 new.target
在陷阱内转发默认行为Reflect.*手写等价操作与陷阱同名同参、返回值天然契合

well-known symbols 速查

symbol定制的内置操作
Symbol.iterator / Symbol.asyncIteratorfor...of / for await...of、扩展、解构
Symbol.toPrimitive对象 → 原始值(hintnumber / string / default
Symbol.toStringTagObject.prototype.toString[object Xxx]
Symbol.hasInstanceinstanceof 判定
Symbol.isConcatSpreadableArray.prototype.concat 是否展开
Symbol.match / replace / search / split / matchAll对应 String.prototype 方法
Symbol.species派生对象的构造器
Symbol.unscopableswith 排除的属性
Symbol.dispose / Symbol.asyncDisposeusing / await using 的释放钩子(ES2026)

Symbol(desc) 每次唯一不可重得;Symbol.for(key) 走全局注册表、同 key 同值,Symbol.keyFor 反查。

资源管理速查

同步异步
声明using x = resawait using x = res
释放钩子[Symbol.dispose]()[Symbol.asyncDispose]()(回退到 dispose
手动容器DisposableStackAsyncDisposableStack
释放方法dispose()await disposeAsync()
容器方法use / adopt / defer / move同左(异步变体)

释放顺序「后声明先释放」;释放期异常聚合为 SuppressedError.error 新错误、.suppressed 原错误)。

Baseline / 版本状态(2026-06 核)

特性版本状态建议
生成器 / 迭代协议 / yield*ES2015✅ Baseline 广泛可用放心用
异步生成器 / for await...ofES2018✅ Baseline 广泛可用放心用
Proxy / Reflect / Proxy.revocableES2015✅ Baseline 广泛可用放心用;Proxy 不可完整 polyfill
well-known symbols(toPrimitive / hasInstance …)ES2015 起✅ Baseline 广泛可用放心用
WeakRef / FinalizationRegistryES2021✅ 广泛可用仅作辅助,勿依赖回收时机
Array.fromAsyncES2024🟡 Baseline 新近可用老环境检测 / polyfill
Iterator Helpers(take / map …)ES2025🟡 Baseline 新近可用老环境降级为 [...it]
using / await using / Symbol.dispose / DisposableStackES2026(Stage 4)🟠 非 BaselineV8 / Node 24+ / TS 5.2+ 已支持;Safari / Firefox 跟进;投产前确认环境或降级(core-js

权威链接

标准 / 规范

课程 / 指南

兼容性 / 调试

相关页