hasownproperty() 可准确判断属性是否为对象自有可枚举属性:true 表示是,false 表示非自有(继承、不可枚举或不存在);它不查原型链,需配合 in 操作符区分属性来源,检测不可枚举自有属性则需用 object.getownpropertynames() 或 object.getownpropertysymbols()。

用 hasOwnProperty() 方法可以准确判断一个属性是否为对象的自有属性(即直接定义在该对象上),而非从原型链继承而来。
使用 hasOwnProperty() 检测自有属性
obj.hasOwnProperty(prop) 返回布尔值:true 表示该属性是对象自身的可枚举属性,false 表示它不存在于对象自身(可能是继承的、不可枚举的,或根本不存在)。
- 只检查对象自身,不查找原型链
- 对所有可枚举的自有属性都有效(包括字符串、Symbol 类型键)
- 不能检测不可枚举的自有属性(如通过
Object.defineProperty设置enumerable: false的属性)
区分继承属性:结合 in 操作符
prop in obj 会返回 true 如果属性存在于对象自身或其原型链上。因此,对比 in 和 hasOwnProperty 就能明确属性来源:
-
'x' in obj && !obj.hasOwnProperty('x')→ 是继承属性 -
obj.hasOwnProperty('x')→ 是自有属性(且可枚举) -
!(prop in obj)→ 属性完全不存在
更全面的自有属性检测(含不可枚举属性)
如果需要检测包括不可枚举的自有属性,应使用 Object.getOwnPropertyNames() 或 Object.getOwnPropertySymbols():
-
Object.getOwnPropertyNames(obj).includes(prop)—— 检查自有属性(含不可枚举字符串键) -
Object.getOwnPropertySymbols(obj).includes(sym)—— 检查自有 Symbol 属性 - 组合两者可覆盖全部自有属性类型
注意原型链上的属性可能被遮蔽
当子对象定义了与原型同名的属性时,该自有属性会“遮蔽”原型上的同名继承属性。此时 hasOwnProperty 返回 true,in 也返回 true,但访问 obj.prop 实际取的是自有值。这是 JavaScript 原型机制的正常行为,不是检测失效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











