hasownproperty仅判断属性是否为对象自有属性,与enumerable、writable、configurable等描述符无关;它返回布尔值,不受属性可见性或权限设置影响,对symbol属性同样有效。

hasOwnProperty 本身不处理属性描述符的可见性,它只判断属性是否为对象自有属性,和 enumerable、writable、configurable 等描述符特性无关。
它返回的是布尔值(true / false),仅说明:这个属性名是不是直接定义在该对象上,而不是从原型链继承来的。至于该属性是否可枚举、是否可写、是否可配置——这些由属性描述符控制,hasOwnProperty 完全不关心,也不受其影响。
hasOwnProperty 和属性描述符的关系很明确
✅ 它能识别不可枚举的自有属性
即使你用Object.defineProperty(obj, 'x', { enumerable: false })添加了一个不可枚举属性,obj.hasOwnProperty('x')依然返回true。
因为“不可枚举” ≠ “不是自有属性”。❌ 它无法识别原型上的属性,无论是否可枚举
比如{}.hasOwnProperty('toString')是false,尽管toString在for...in中会出现(因为Object.prototype.toString是可枚举的),但它不属于空对象自身。❌ 它对 Symbol 属性同样有效
obj.hasOwnProperty(Symbol('key'))可以正常工作,只要该 Symbol 是对象自身的属性。
描述符可见性真正由什么控制?
| 描述符字段 | 影响哪些行为 |
|---|---|
enumerable: false |
for...in 跳过、Object.keys() 不包含、JSON.stringify() 忽略 |
configurable: false |
不能 delete,不能用 defineProperty 修改 writable/enumerable/configurable(除非 writable: true 时可改 value) |
writable: false |
赋值操作静默失败(非严格模式)或报错(严格模式) |
而 hasOwnProperty 对上述任何一种设置都无感——它只看“归属”,不看“权限”或“遍历表现”。
实际使用建议
- 检查属性是否存在且属于对象自己?→ 用
hasOwnProperty - 检查属性是否能在
for...in或Object.keys()中出现?→ 看enumerable - 想知道属性能不能被删、能不能改描述符?→ 查
configurable - 需要完整了解属性行为(比如是否带 getter/setter)?→ 用
Object.getOwnPropertyDescriptor(obj, key)
例如:
const obj = {};
Object.defineProperty(obj, 'hidden', {
value: 42,
enumerable: false,
configurable: true,
writable: true
});
console.log(obj.hasOwnProperty('hidden')); // true
console.log(Object.keys(obj)); // []
console.log(Object.getOwnPropertyDescriptor(obj, 'hidden'));
// { value: 42, writable: true, enumerable: false, configurable: true }
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











