Object.hasOwn() 仅检测对象自身属性,无论是否为 Symbol 类型或是否可枚举,均能准确返回布尔值;它不查找原型链,且比 hasOwnProperty() 更安全,是判断自身属性存在的最直接可靠方法。

Object.hasOwn() 只检测对象自身的属性,不关心属性是否可枚举、是否为 Symbol 类型,只要该属性是对象**自身拥有的**(own property),它就能正确返回 true 或 false。
能准确识别 Symbol 类型的自身属性
Symbol 属性只要被定义在对象自身上,Object.hasOwn(obj, sym) 就会返回 true,无论该 Symbol 属性是否可枚举。
- 例如:
const sym = Symbol('id'); const obj = {[sym]: 123}; Object.hasOwn(obj, sym) === true - 这与
Object.keys()不同——keys()完全忽略 Symbol 属性;而hasOwn()对 Symbol 键完全支持。
对不可枚举的自身属性同样有效
不可枚举属性(如通过 Object.defineProperty 设置 enumerable: false)仍是对象自身的属性,Object.hasOwn() 会如实检测到。
- 例如:
const obj = {}; Object.defineProperty(obj, 'hidden', { value: 42, enumerable: false }); Object.hasOwn(obj, 'hidden') === true - 而
for...in或Object.keys()都会跳过这个属性,但hasOwn()不受影响。
不处理原型链上的 Symbol 或不可枚举属性
Object.hasOwn() 的核心原则是“只查自身”,所以即使原型上有 Symbol 属性或不可枚举属性,它也一律返回 false。
- 例如:
const proto = { [Symbol('x')]: 'from proto' }; const obj = Object.create(proto); Object.hasOwn(obj, Symbol('x')) === false(因为 Symbol('x') 在原型上,不在obj自身) - 这点和
hasOwnProperty()行为一致,但更安全——不会被对象自身重写的hasOwnProperty方法干扰。
对比其他方法:为什么 hasOwn 更可靠?
要同时覆盖 Symbol + 不可枚举 + 自身性,单独用 Object.keys() 或 Object.getOwnPropertyNames() 都不够:
-
Object.keys():漏掉 Symbol 和不可枚举属性 -
Object.getOwnPropertyNames():能捕获不可枚举字符串键,但漏掉 Symbol -
Object.getOwnPropertySymbols():只管 Symbol,不管字符串键 -
Reflect.ownKeys():能拿到全部自身键(含 Symbol 和不可枚举),但它是获取键列表,不是布尔判断 -
Object.hasOwn():直接、简洁、语义明确,一步到位判断「某 key 是否为该对象自身属性」,无类型或枚举性限制











