Object.hasOwn只检测对象自身属性,不检测继承属性。无论继承属性是否可枚举、是否为Symbol、是否不可配置,Object.hasOwn(obj, key)均返回false;它仅对自有属性(包括不可枚举的)返回true。

不能。
Object.hasOwn 只检测对象自身是否拥有某个属性,不管该属性是否可枚举、是否为 Symbol、是否不可配置——但前提是它必须是自有属性。继承属性,无论是否可枚举、是否不可枚举,都不会被 Object.hasOwn 识别为 true。
- 继承属性来自原型链(比如
Object.prototype.toString或通过Object.create(proto)设置的原型属性); - 即使这个继承属性被设为
enumerable: false,它依然不是目标对象自身的属性; - 所以
Object.hasOwn(obj, 'someInheritedKey')永远返回false。
例如:
const proto = {};
Object.defineProperty(proto, 'hidden', {
value: 99,
enumerable: false,
configurable: true
});
const obj = Object.create(proto);
Object.hasOwn(obj, 'hidden'); // false —— 尽管不可枚举,但它在 proto 上,不在 obj 自身
obj.hasOwnProperty('hidden'); // false —— 同样不认继承来的
'hidden' in obj; // true —— in 会查原型链,所以能命中如果你看到某个“不可枚举的属性”被 Object.hasOwn 检测到,那说明它确实是通过 Object.defineProperty(obj, ...) 或字面量直接定义在 obj 自身上的,而不是从原型继承来的。
简单说:
✅ Object.hasOwn 能检测自身 + 不可枚举的属性;
❌ 它不能检测继承 + 不可枚举(或任何继承)的属性。
这正是它和 in、for...in 的关键区别:它只看“是不是我生的”,不看“我爹有没有”。

















