Object.hasOwn 是 ES2022 推荐的健壮方法,用于准确判断属性是否直接存在于对象自身:它不依赖对象状态,避免了 in(检查整个原型链)和 hasOwnProperty(可能被重写或遮蔽)的问题。

Object.hasOwn 是 ES2022 引入的推荐方式,用于准确判断一个属性是否直接存在于对象自身(而非原型链上),从而安全地过滤掉继承属性。
为什么不用 in 或 hasOwnProperty?
in 操作符会检查整个原型链,无法区分自有属性和继承属性;obj.hasOwnProperty(prop) 虽可判断自有属性,但若对象自身重写了 hasOwnProperty 方法或原型链上存在同名属性,就可能出错。而 Object.hasOwn(obj, prop) 是静态方法,不依赖对象自身状态,更健壮。
过滤对象自身可枚举属性
结合 Object.keys() 或 for...in 使用,确保只处理自有属性:
- 用 Object.keys(obj) 最简单——它默认只返回自身可枚举属性,无需额外过滤
- 若需处理不可枚举属性(如通过 Object.defineProperty 设置的 enumerable: false 属性),则必须配合 Object.getOwnPropertyNames() 或 Object.getOwnPropertySymbols(),再用 Object.hasOwn 校验
安全遍历并过滤继承属性
在 for...in 循环中,显式跳过继承属性:
for (const key in obj) {
if (Object.hasOwn(obj, key)) {
console.log(key, obj[key]);
}
}
这样即使 obj 的原型上有同名属性(如 toString),也不会被误选。
批量提取自有属性键值对
构建仅含自身属性的新对象:
const ownEntries = Object.entries(obj).filter( ([key]) => Object.hasOwn(obj, key) ); const ownObj = Object.fromEntries(ownEntries);
注意:Object.entries() 本身已只返回自身可枚举属性,此处 Object.hasOwn 属于冗余防护;但若逻辑涉及动态属性访问或不确定枚举性时,加上更稳妥。

















