reflect.has() 是 javascript 中判断对象(含原型链)是否具有指定属性的标准方法,等价于 in 操作符,返回布尔值,支持 proxy 拦截,但不区分自有与继承属性;需检测自有属性时应使用 object.hasown() 或 hasownproperty.call()。

Reflect.has() 是 JavaScript 中判断对象是否具有某个属性的标准方法,它等价于 in 操作符,但更规范、更函数式,且能正确处理 Proxy 场景。
用 Reflect.has() 判断自有属性或原型链上的属性
Reflect.has(target, key) 返回布尔值,检查 target 对象(包括其原型链)是否拥有指定的属性键(字符串或 Symbol)。它不区分自有属性和继承属性,行为与 key in target 完全一致。
- 第一个参数是目标对象,不能为 null 或 undefined(会抛错)
- 第二个参数是属性名,会被强制转为字符串(如数字 42 → "42"),Symbol 类型保持不变
- 支持 Proxy 的
has拦截器,适合元编程场景
例如:
const obj = { a: 1 };Reflect.has(obj, 'a'); // true
Reflect.has(obj, 'toString'); // true(继承自 Object.prototype)
Reflect.has(obj, 'b'); // false
想只检测自有属性?用 Object.prototype.hasOwnProperty()
Reflect.has() 无法区分自有属性和继承属性。如果只关心对象自身是否定义了该属性(不查原型链),应使用 Object.prototype.hasOwnProperty.call(obj, key)。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 推荐用
hasOwnProperty.call()而非直接调用obj.hasOwnProperty(),避免对象自身重写了该方法导致误判 - ES2022 引入了
Object.hasOwn(obj, key),是更现代、更安全的替代方案
例如:
const obj = { a: 1 };Object.hasOwn(obj, 'a'); // true
Object.hasOwn(obj, 'toString'); // false
注意陷阱:undefined 和 in/has 的区别
属性值为 undefined 不影响 Reflect.has() 结果——只要属性存在(哪怕值是 undefined),就返回 true。
-
obj.prop = undefined;后,Reflect.has(obj, 'prop')仍为true - 而
obj.prop === undefined无法区分“属性不存在”和“属性存在但值为 undefined” - 若需同时判断存在性和值有效性,需组合使用
Reflect.has()和取值判断
Proxy 中的 has 拦截必须返回布尔值
在 Proxy 的 handler 中实现 has 方法时,返回值必须是布尔类型,否则会抛出 TypeError。
- 返回
false时,即使属性实际存在,key in proxy或Reflect.has(proxy, key)也会返回false - 这是实现私有属性、权限控制等逻辑的关键机制
例如:
const handler = {has(target, key) {
return key !== 'secret' && key in target;
}
};
const proxy = new Proxy({ a: 1, secret: 42 }, handler);
Reflect.has(proxy, 'a'); // true
Reflect.has(proxy, 'secret'); // false
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










