object.hasown能准确检测对象自身的不可配置属性,无论其configurable、enumerable或writable特性如何;它只判断属性是否直接存在于对象内部,不依赖属性描述符,也不受原型链污染影响。

Object.hasOwn 能检测到不可配置属性,只要该属性是对象自身的(own),无论其 configurable、enumerable 或 writable 特性如何。
它只关心“是不是自有属性”,不关心属性描述符
Object.hasOwn 的判断依据是属性是否直接存在于目标对象内部,与属性的配置特性完全无关。例如:
- 即使一个属性被设为
{ configurable: false, enumerable: false },只要它是对象自身的,Object.hasOwn(obj, 'key')就返回true; - 删除一个不可配置属性会失败(严格模式下报错),但该属性依然存在——
Object.hasOwn仍能正确识别; - 用
Object.defineProperty添加的不可枚举、不可配置属性,也能被Object.hasOwn检测到。
和 hasOwnProperty 行为一致,但更可靠
这一点与 hasOwnProperty 完全相同,但 Object.hasOwn 不受对象自身覆盖或原型链污染影响。比如:
const obj = {}; Object.defineProperty(obj, 'hidden', { value: 1, enumerable: false, configurable: false });-
Object.hasOwn(obj, 'hidden')→true -
obj.hidden = undefined或obj.hidden = null后,Object.hasOwn(obj, 'hidden')仍是true
注意:它不检测属性值是否为 undefined
属性值是 undefined、null、0 或空字符串,都不影响结果。只要属性本身存在且属于对象自身,就返回 true。
不能检测的边界情况
以下情形 Object.hasOwn 一律返回 false:
- 属性来自原型链(哪怕不可配置);
- 传入的不是对象(如
null、undefined、字符串、数字),会直接抛TypeError; - 属性名是动态计算但未实际定义在对象上(例如拼错键名)。











