Proxy 与元编程

共 34 题
#

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 运行时用它传播拒绝 ✓ 正确答案