object.hasown 方法能安全、直观地判断对象自有属性,避免 in 操作符的原型链污染和 obj[prop] !== undefined 的歧义,适用于精准过滤自有属性。

Object.hasOwn 能让对象属性过滤更安全、更直观,尤其替代容易出错的 in 操作符或不严谨的 obj[prop] !== undefined 判断。
避免 in 操作符的原型污染问题
in 会检查整个原型链,导致继承来的属性也被误认为是自有属性。比如:
const obj = { name: 'Alice' };
console.log('toString' in obj); // true(来自 Object.prototype)
用 Object.hasOwn 就只看对象自身:
-
Object.hasOwn(obj, 'name')→true -
Object.hasOwn(obj, 'toString')→false
比 obj[prop] !== undefined 更准确
直接访问属性可能返回 undefined,但无法区分“属性不存在”和“属性值就是 undefined”。例如:
const obj = { count: undefined };
obj.count === undefined; // true —— 但 count 是存在的!
而 Object.hasOwn 明确回答“这个键是否在对象上声明过”:
-
Object.hasOwn(obj, 'count')→true -
Object.hasOwn(obj, 'age')→false
在过滤器中干净地保留指定自有属性
常见需求:从一个对象中提取一组白名单字段,且只取对象自身的(不继承、不为 undefined 的也算存在):
function pickOwn(obj, keys) {
return Object.fromEntries(
keys
.filter(key => Object.hasOwn(obj, key))
.map(key => [key, obj[key]])
);
}
使用示例:
const user = { id: 1, name: 'Bob', role: undefined };
const safeKeys = ['id', 'name', 'role', 'email'];
console.log(pickOwn(user, safeKeys));
// { id: 1, name: 'Bob', role: undefined }
它不会把原型上的 toString 混进来,也不会漏掉值为 undefined 的合法字段。
兼容性注意(现代环境优先)
Object.hasOwn 是 ES2022 新增方法,已覆盖 Chrome 93+、Firefox 97+、Safari 16.4+ 和 Node.js 16.9+。若需支持更老环境,可用 Object.prototype.hasOwnProperty.call(obj, key) 作为安全降级。











