Object.hasOwn 是 ES2022 正式引入的静态方法,彻底解决 hasOwnProperty 的原型链污染、自身覆盖、null/undefined 报错等问题,支持 Symbol 和数字键,只查自有属性,语义清晰且更安全可靠。

Object.hasOwn 是 ES2022(ES13)正式引入的静态方法,它不是 hasOwnProperty 的语法糖,而是从设计上解决了后者长期存在的可靠性缺陷。现代开发中,它已是检查对象自有属性的首选方式。
完全避开原型链污染和自身覆盖风险
hasOwnProperty 是挂载在 Object.prototype 上的实例方法,所有普通对象靠继承使用它。但一旦对象自身定义了同名属性(比如 { hasOwnProperty: null } 或 { hasOwnProperty: () => false }),调用就会返回错误结果甚至直接报错。
Object.hasOwn 是静态函数,调用形式为 Object.hasOwn(obj, key),不依赖目标对象的任何原型或自身属性。即使对象是 Object.create(null) 创建的(没有原型),也能安全运行。
对 null 和 undefined 天然安全
对 null 或 undefined 调用 obj.hasOwnProperty('key') 会立即抛出 TypeError;而 Object.hasOwn(null, 'key') 和 Object.hasOwn(undefined, 'key') 稳定返回 false,符合“不存在即为 false”的直觉逻辑。
立即学习“Java免费学习笔记(深入)”;
这意味着你不再需要写冗长的兜底判断:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
obj && obj.hasOwnProperty && obj.hasOwnProperty(key)- 也不必用
Object.prototype.hasOwnProperty.call(obj, key)这种绕弯写法
语义清晰,支持更广的键类型
Object.hasOwn 明确表达“检查某对象是否拥有某属性”,调用主体是 Object,行为与对象状态解耦,无歧义。
它支持多种键类型:
- 字符串键:
Object.hasOwn(obj, 'name') - Symbol 键:
Object.hasOwn(obj, Symbol('id')) - 数字键(自动转为字符串):
Object.hasOwn(obj, 42),行为与in操作符一致
注意:它只检查对象自身属性,不查找原型链——这点和 in 有本质区别,不可混淆。
在实际场景中更可靠
比如封装安全赋值函数、定义属性前做存在性校验、配合 Proxy 实现精准拦截时,Object.hasOwn 都能避免因原型异常或对象构造特殊导致的逻辑断裂。
例如:
- 设置前判断:
if (!Object.hasOwn(obj, 'value')) Object.defineProperty(obj, 'value', { ... }) - 安全赋值:
function safeSet(obj, key, val) { if (Object.hasOwn(obj, key)) return false; obj[key] = val; return true; } - Proxy 中区分自有/继承属性:
handler.get(target, prop) { if (Object.hasOwn(target, prop)) { /* 自有属性逻辑 */ } }

















