object.hasown 能精准检测对象自身所有属性(含不可枚举属性和 symbol 属性),不依赖原型链或可枚举性,比 in、object.keys 和 object.getownpropertynames 更高效直接。

Object.hasOwn 会正确识别不可枚举的自身属性。
它天然支持不可枚举属性
和 hasOwnProperty() 一样,Object.hasOwn() 检查的是对象自身的所有属性——无论是否可枚举、是否为 Symbol 类型、是否被设为 enumerable: false,只要该属性真实存在于对象自身上,就会返回 true。
- 比如用
Object.defineProperty添加的不可枚举属性:const obj = {}; Object.defineProperty(obj, 'hidden', { value: 42, enumerable: false });Object.hasOwn(obj, 'hidden')→true - 它不依赖
for...in或Object.keys()等只处理可枚举属性的机制,因此不会漏掉不可枚举项 - 这点与
Object.getOwnPropertyNames()的覆盖范围一致(都包含不可枚举属性),但Object.hasOwn()是单键检测,更轻量、更直接
和其它方法的关键区别
对比常见方式,更能看出它的定位:
-
'key' in obj:检查自身 + 原型链,不管是否可枚举,也不管是否自身 -
Object.keys(obj).includes('key'):只查自身可枚举属性,漏掉不可枚举的 -
Object.getOwnPropertyNames(obj).includes('key'):能查到不可枚举属性,但要先生成整个数组,开销大 -
Object.hasOwn(obj, 'key'):精准、高效、语义明确——只问“这个 key 是不是它自己身上的”,答案包含不可枚举属性
注意 Symbol 属性也适用
不可枚举的 Symbol 属性同样被支持:
const sym = Symbol('id'); const obj = {}; Object.defineProperty(obj, sym, { value: 1, enumerable: false });-
Object.hasOwn(obj, sym)→true - 但传字符串形式如
'Symbol(id)'无效,必须传原始 Symbol 值











