最直接的方法是用 hasownproperty()——它只返回 true 当属性确实定义在对象自身上,不查原型链;object.hasown(obj, 'key') 更安全,可避免对象重写 hasownproperty 导致异常。

最直接的方法是用 hasOwnProperty() ——它只返回 true 当属性确实定义在对象自身上,不查原型链。
看属性是否属于对象自己
JavaScript 中属性分两类:自身属性(直接挂在对象上)和继承属性(来自 __proto__ 链上的原型)。判断归属,关键看“谁写的这个属性”。
-
'key' in obj:查整个原型链,只要能访问到就返回true,比如'toString' in {}是true -
obj.hasOwnProperty('key'):只看对象自己有没有这个属性,{}.hasOwnProperty('toString')是false -
Object.hasOwn(obj, 'key')(ES2022 新增):比hasOwnProperty更安全,能避免对象自身重写了该方法导致出错
为什么不能只靠 in 或点语法?
因为 in 和 obj.key !== undefined 都会触发原型链查找。比如:
const parent = { a: 1 };
const child = Object.create(parent);
child.b = 2;
console.log('a' in child); // true(继承)
console.log('b' in child); // true(自身)
console.log(child.hasOwnProperty('a')); // false
console.log(child.hasOwnProperty('b')); // true
遇到特殊情况怎么办?
如果对象自己定义了 hasOwnProperty 属性(比如 { hasOwnProperty: true }),调用 obj.hasOwnProperty() 就会报错或行为异常。这时推荐用:
-
Object.hasOwn(obj, 'key')—— 安全、现代、语义清晰 - 或兜底写法:
Object.prototype.hasOwnProperty.call(obj, 'key')
顺便验证属性来源的小技巧
想确认某个属性到底在哪一层,可以用:
-
Object.getOwnPropertyNames(obj):列出对象自身的所有可枚举+不可枚举属性名(不含继承) -
Object.getPrototypeOf(obj):拿到它的直接原型,再对原型重复检查 - 配合
Object.getOwnPropertyDescriptor(obj, 'key')看属性的value、enumerable等细节,进一步确认是否为自有











