# 1. Proxy.revocable 临时凭证 在大型状态管理的设计取舍 A revoke 后代理所有操作抛 TypeError 且不可恢复,适合做限时限权的临时访问凭证 ✓ 正确答案 B revoke 后代理仍可读取 C 撤销的代理可以再次启用 D revocable 与普通 Proxy 完全等价
# 2. Object.hasOwn/Object.fromEntries/Object.groupBy 在数据变换的工程价值 A Object.hasOwn 会沿原型链查找 B Object.hasOwn 检查自有属性且避免原型遮蔽问题,Object.groupBy 按回调键分组聚合 ✓ 正确答案 C Object.fromEntries 接受任意嵌套对象 D Object.groupBy 只能按数字键分组
# 3. Symbol.metadata 与装饰器元数据在反射编程的应用 A 元数据只能写在全局对象上 B Symbol.metadata 是运行时可变的状态存储 C 装饰器经 context.metadata 写入元数据,类经 Symbol.metadata 暴露并按原型链合并,支撑反射式框架 ✓ 正确答案 D 装饰器无法访问元数据
# 4. Proxy trap 的性能开销与回退判断 A trap 内逻辑不会影响性能 B Proxy 访问与普通字段访问开销相同 C Proxy 每次操作都经 trap 分发且无法享受形状优化,热点路径应评估回退到普通对象 ✓ 正确答案 D 代理对象可以被 V8 完全内联优化
# 5. Proxy 的 13 个拦截陷阱(trap)在 Vue 3 响应式与 MobX 可观察对象中的最小集取舍 A 响应式需要实现全部 13 个 trap B Vue 3 响应式核心实现 get/set/has/ownKeys/deleteProperty 五个 trap,其余走默认转发 ✓ 正确答案 C ownKeys 可以单独实现而不顾 getOwnPropertyDescriptor D apply trap 是响应式的核心
# 6. Proxy 的 get trap 中如何实现负索引、链式调用与链式代理的拦截 A get trap 可改写属性语义(负索引)、包装方法(链式调用)并惰性生成嵌套代理(链式代理) ✓ 正确答案 B get trap 只能返回原值 C 负索引实现无需配合 has trap D 链式代理必须一次性创建完整对象树
# 7. Reflect API 与 Proxy 的关系(Reflect.get 对应 [[Get]] 内部方法)在元编程时的工程价值 A Reflect 方法对应对象内部方法,Proxy trap 默认行为即 Reflect 转发,trap 内用它保持语义 ✓ 正确答案 B Reflect 与 Proxy 无关 C Reflect.set 在失败时抛异常 D Reflect 只能用于代理对象
# 8. Reflect.apply/Reflect.construct 与 Function.prototype.apply/call 的语义差异与历史包袱 A apply/call 不存在被覆盖的风险 B Reflect.apply 与 fn.apply 完全等价且无差异 C Reflect.construct 不能指定 newTarget D Reflect.apply 统一 (fn, thisArg, args) 形态且不受 prototype 污染影响,Reflect.construct 支持 newTarget ✓ 正确答案
# 9. Proxy 在对象不可变封装(Object.freeze 与 Proxy 包装) A freeze 自动深冻结嵌套对象 B 冻结对象上可以通过 set trap 放行写入 C freeze 是静态封装,Proxy 是动态拦截;冻结目标上的 set trap 会因不变量检查抛错 ✓ 正确答案 D Proxy 封装后对象不再受 freeze 约束
# 10. Reflect.ownKeys/Reflect.getPrototypeOf 与对应 Object.* API 的能力差异 A Object.defineProperty 返回布尔值 B Reflect.ownKeys 与 Object.keys 返回相同 C Reflect.getPrototypeOf(1) 返回 Number.prototype D Reflect.ownKeys 返回含 Symbol 的自有键全集,Reflect.getPrototypeOf 不做 ToObject 装箱 ✓ 正确答案
# 11. Proxy 的 invariant(不变量)在实现响应式时的边界与陷阱 A 不可扩展目标可以自由返回虚拟键 B 不变量只约束 get trap C trap 返回值必须与目标真实状态一致,对不可配置/只读属性改写或返回虚拟键都会抛 TypeError ✓ 正确答案 D 响应式代理不会触发不变量检查
# 12. Proxy 在响应式系统(Vue 3)与数据校验的应用 A Vue 3 用 get/set/has/ownKeys/deleteProperty 实现依赖收集与触发,set trap 也常用于写入校验 ✓ 正确答案 B Vue 3 用 defineProperty 拦截数组索引 C Proxy 无法代理新增属性 D 数据校验只能写在业务函数里
# 13. Proxy 与 Reflect 的 trap 不变量与边界 A 不变量要求 trap 返回值与目标真实状态相容,Reflect 转发会自动执行相同检查 ✓ 正确答案 B Reflect 转发会跳过不变量检查 C 虚拟属性只需实现 get trap D 不可扩展目标可以返回任意键集合
# 14. Proxy 陷阱触发顺序(get/has/defineProperty) A 展开/解构/for...in 等组合操作会依次触发 ownKeys、getOwnPropertyDescriptor 与 get 等多个 trap ✓ 正确答案 B in 操作只触发 get trap C Object.keys 只触发一次 trap D 所有操作都只触发单一 trap
# 15. Proxy 的 revoke(Proxy.revocable)在临时凭证场景的应用 A revoke 后代理所有操作抛 TypeError 且不可恢复,适合做临时凭证的发放与收回 ✓ 正确答案 B 撤销后代理仍可读 C revoke 可以再次恢复代理 D 撤销只影响部分操作
# 16. Object.hasOwn() 与 Object.prototype.hasOwnProperty.call() 的安全差异 A obj.hasOwnProperty 永远不会被覆盖 B Object.hasOwn 会沿原型链查找 C Object.hasOwn 是引擎级自有属性检查,不受对象上的 hasOwnProperty 遮蔽影响且支持 null 原型对象 ✓ 正确答案 D Object.hasOwn 与 in 运算符等价
# 17. Proxy 性能开销(每次属性访问的拦截调用)在热点路径的取舍与不可代理的内置 slot(如 Date) A 热点路径适合大量使用 Proxy B Proxy 可以完全代理 Date 实例 C 代理访问与普通访问开销相同 D Date 等内置对象依赖内部槽存储状态,Proxy 无法模拟,对其代理会导致内部方法抛 TypeError ✓ 正确答案
# 18. Proxy 与 Vue 3 的 reactive() 在嵌套对象与数组的代理回收与 lazy 初始化的现代实现 A 数组不需要代理也能响应式 B reactive 会立即深代理所有嵌套对象 C WeakMap 缓存使代理成为强引用造成泄漏 D Vue 3 懒递归代理嵌套对象并用 WeakMap 缓存保证同一原始对象对应同一代理 ✓ 正确答案
# 19. Symbol 类型作为对象唯一属性的工程价值(避免命名冲突、定义协议语义) A Symbol 键可以被 for...in 枚举 B Symbol 键全局唯一且不进 for...in/JSON.stringify,适合扩展对象与隐藏元数据 ✓ 正确答案 C Symbol 键会出现 JSON.stringify 输出中 D Symbol 与字符串键完全等价
# 20. Symbol.iterator/Symbol.asyncIterator 在自定义可迭代对象与 for-await-of 的协议实现 A for...of 与 for await...of 使用同一协议 B 可迭代对象实现 [Symbol.iterator] 返回含 next 的迭代器,for await...of 消费 asyncIterator 并支持提前退出清理 ✓ 正确答案 C 迭代器不需要 next 方法 D 提前退出不会调用 return
# 21. Generator Function(function*)的暂停-恢复机制在异步流程控制与状态机的应用 A 生成器通过 yield 暂停、next(value) 恢复形成协程,yield Promise 即可实现异步流程控制 ✓ 正确答案 B 生成器无法接收外部传入的值 C 生成器函数每次调用返回同一迭代器 D async/await 与生成器无关
# 22. Generator 的 yield* 委托迭代在递归遍历树形结构与组合迭代器的工程实践 A yield* 无法用于递归 B yield* 只复制值不转发控制权 C yield* 把控制权委托给子迭代器并转发产出与清理调用,可优雅实现树的递归扁平化 ✓ 正确答案 D 委托时 return 不会传给子迭代器
# 23. Async Generator(async function*)与 Async Iterator 在 Node.js 流与 Web Streams 的协作 A 流的取消不会传播到迭代器 B 流不能转为异步迭代器 C for await...of 消费流时无背压概念 D Node Readable 与 Web ReadableStream 都可被 for await...of 消费,提前退出会触发底层取消 ✓ 正确答案
# 24. Proxy 的 ownKeys/getOwnPropertyDescriptor 拦截在不可枚举属性模拟的工程应用 A ownKeys 单独就能控制可枚举性 B ownKeys 与 getOwnPropertyDescriptor 配合可模拟不可枚举的虚拟属性,使其不进 Object.keys 与 JSON.stringify ✓ 正确答案 C 虚拟属性不受不变量约束 D in 运算与枚举拦截无关
# 25. Reflect.ownKeys 与 Object.keys 在 Symbol 与不可枚举属性枚举的差异 A Reflect.ownKeys 不含不可枚举属性 B Object.keys 包含 Symbol 键 C Reflect.ownKeys 返回含 Symbol 与不可枚举的全部自有键,Object.keys 只返回可枚举字符串键 ✓ 正确答案 D for...in 只遍历自有属性
# 26. Proxy 的 has trap(in 操作符)在权限校验与 in 表达式拦截的现代工程价值 A has 返回 false 时 get 仍可返回任意值 B has trap 只影响 for...in C has trap 拦截 in 运算,可将权限建模为字段存在性,但需与 get/ownKeys 保持口径一致 ✓ 正确答案 D 不可配置属性上 has 可以返回 false
# 27. Symbol.for 与 Symbol 的全局注册表(Symbol 注册池) A Symbol() 创建的符号也会进入注册表 B Symbol.for 按 key 在跨 Realm 共享的全局注册表中复用符号,Symbol.keyFor 只查询注册表内符号 ✓ 正确答案 C Symbol.keyFor 能返回任意 Symbol 的 key D 注册表按符号内容去重
# 28. Proxy 与 defineProperty/Object.freeze 的边界,Proxy 无法拦截配置或扩展性内部槽的限制 A 代理可以任意谎报目标扩展性 B isExtensible/preventExtensions 等 trap 受不变量约束,代理不能歪曲目标的扩展性与配置事实 ✓ 正确答案 C 不可扩展目标上可以自由添加虚拟键 D defineProperty trap 不受任何约束
# 29. Iterator Helper 方法(map、filter、take、drop,Stage 4 提案)在大型数据流的现代工程价值 A Iterator Helper 不能处理无限序列 B Iterator Helper 与数组方法一样立即生成数组 C Iterator Helper 惰性求值避免中间数组分配,适合无限序列与大数据流,但迭代器只能消费一次 ✓ 正确答案 D Iterator Helper 会为每步创建中间数组
# 30. 元编程(Reflection / Decorators) A 元编程只有装饰器一种形式 B Reflect/Proxy 构成运行时元编程,装饰器与 Symbol.metadata 构成设计时元编程,应聚焦于框架层 ✓ 正确答案 C Proxy 属于设计时元编程 D 元编程不应限制使用范围
# 31. Proxy 在 Immer 的不可变数据实现中扮演的拦截与写时复制角色 A Immer 每次修改都深拷贝整个状态 B Immer 用 Proxy 拦截 draft 修改并写时复制,未修改子树保持引用共享形成结构共享 ✓ 正确答案 C draft 可以安全地在异步回调中继续使用 D Immer 不使用 Proxy
# 32. Object.fromEntries 与 Proxy 拦截的 set trap 在 Map-like API 与迭代协作的工程价值 A set trap 无法规范化写入值 B fromEntries 只能处理 Map C fromEntries 把键值对迭代序列构造为对象,set trap 可在写入时校验,Symbol.iterator 使对象可迭代 ✓ 正确答案 D 迭代协议与 set trap 无需保持一致
# 33. Proxy 的 apply 与 construct trap 在函数与 class 实例化时的元编程边界 A apply trap 拦截函数调用实现 AOP,construct trap 拦截 new 并可经 newTarget 控制实例原型 ✓ 正确答案 B construct trap 可以返回任意原始值 C apply trap 对非函数目标同样生效 D construct trap 无法影响实例创建
# 34. Generator.throw() 在协程式错误传播与 co 风格异步流的工程实践 A next 与 throw 无关 B throw 只能从生成器向外抛出 C 生成器内部无法捕获 throw 注入的错误 D generator.throw() 把错误注入当前 yield 暂停点,可被内部 try/catch 捕获,co 运行时用它传播拒绝 ✓ 正确答案