object.hasown(obj, 'prop')是最安全的自有属性检测方法,不查原型链,不受hasownproperty被覆盖或null原型对象影响,且对null/undefined返回false而非报错。

直接用 Object.hasOwn(obj, 'prop') ——这是目前最推荐、最安全的检测方式,专为判断对象“自有属性”而生,不查原型链,也不怕对象污染。
只查对象自己有没有这个属性
很多场景下,你真正关心的是:这个属性是不是明明白白定义在当前对象上,而不是从 Object.prototype 或其他原型继承来的(比如 toString、valueOf)。这时不能用 in,因为它会把继承属性也当“存在”。
-
'toString' in obj→ 返回 true(但你通常不希望它算“有”) -
obj.hasOwnProperty('toString')→ 返回 false(正确) -
Object.hasOwn(obj, 'toString')→ 同样返回 false,且更稳
避开 hasOwnProperty 被覆盖的风险
老方法 obj.hasOwnProperty('x') 有个隐患:如果对象自己定义了 hasOwnProperty 属性(哪怕只是个函数或值),调用就会失效甚至报错。
- 比如:
const bad = { hasOwnProperty: () => false, x: 123 } -
bad.hasOwnProperty('x')→ 错误地返回 false -
Object.hasOwn(bad, 'x')→ 正确返回 true,完全不受干扰
兼容 null / undefined 输入
Object.hasOwn() 对非对象类型做了容错处理:
-
Object.hasOwn(null, 'x')→ 安全返回 false(不会报错) -
Object.hasOwn(undefined, 'y')→ 同样返回 false - 而
null.hasOwnProperty('x')会直接抛出TypeError
替代方案对比(什么情况下用别的)
不是所有情况都必须用 Object.hasOwn:
- 要连原型链一起查(比如确认能否调用某个方法)→ 用
'prop' in obj或Reflect.has(obj, 'prop') - 只查可枚举的自有属性(如遍历时需要)→
Object.keys(obj).includes('prop') - 环境不支持 ES2022(极旧项目)→ 回退到
Object.prototype.hasOwnProperty.call(obj, 'prop')
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











