Reflect.set 返回 true 表示赋值操作成功完成且未被拦截阻止,返回 false 仅当 Proxy 的 set 捕获器显式返回 false;它不反映业务逻辑成败,仅表示语言级赋值是否被 trap 显式拒绝。

Reflect.set 返回 true 表示赋值操作**成功完成且未被拦截阻止**;返回 false 表示赋值**被代理的 set 捕获器(trap)显式返回 false**,此时赋值被拒绝,且不会触发后续默认行为(如属性写入、原型链查找等)。
返回 true 的典型场景
大多数情况下,Reflect.set 返回 true,包括:
- 目标对象是普通对象,属性可写、可配置,且无 Proxy 拦截
- 目标对象是 Proxy,其
settrap 执行后**未返回值**或**返回非 falsy 值**(如return true;、return undefined;、return 1;等) - 对不可写属性赋值时——只要不处于严格模式,也不会报错,而是静默失败,但 仍返回 true(注意:这是易混淆点!)
返回 false 的唯一明确条件
Reflect.set **仅当 Proxy 的 set trap 显式返回 false 时才返回 false**。这是规范强制约定:
- 其他 falsy 值(如
0、''、null、undefined)均被忽略,视为“未返回”,会继续执行默认逻辑并最终返回true - 若 trap 抛出异常,则
Reflect.set不返回布尔值,而是直接抛错 - 示例:
const p = new Proxy({}, { set: () => false });
Reflect.set(p, 'x', 1); // → false
与 obj.prop = value 的关键区别
Reflect.set 是**可预测的、不抛错的底层操作**,而普通赋值在严格模式下对不可写属性赋值会抛 TypeError:
- 非严格模式下:
obj.x = 1对只读属性静默失败,Reflect.set(obj, 'x', 1)同样返回true(但实际未写入) - 严格模式下:
obj.x = 1直接报错;Reflect.set仍返回true(不抛错,也不写入) - 因此,
Reflect.set的返回值 不能等价于“属性是否真的被修改”,它只反映“操作是否被 trap 显式拒绝”
实用建议:如何正确判断赋值是否生效
依赖 Reflect.set 的返回值做业务逻辑需谨慎。更可靠的验证方式是:
- 赋值后立即用
Reflect.get或属性访问读取值,对比预期 - 结合
Object.getOwnPropertyDescriptor检查属性的writable、configurable状态 - 若使用 Proxy,确保
settrap 在拒绝时统一返回false,并在业务层主动处理该返回值

















