Object.hasOwn()是判断自有属性最推荐的方法,它直接检查对象自身是否拥有某属性,不依赖原型链,兼容Object.create(null),且避免hasOwnProperty被覆盖或缺失的问题。

区分自有属性和继承属性,关键在于确认属性是否直接定义在对象自身上,而不是从原型链“借来”的。JavaScript 提供了几个可靠方式,其中 Object.hasOwn() 是当前最推荐、最安全的方法。
用 Object.hasOwn 判断自有属性
这是 ES2022 正式引入的原生方法,语法简洁、无需绑定、不依赖原型链上的 hasOwnProperty 方法:
- Object.hasOwn(obj, 'key') 返回 true 表示该 key 是 obj 自身拥有的属性(即自有属性)
- 返回 false 表示该 key 不存在于 obj 自身,哪怕它在原型上存在(比如 toString、constructor 或自定义方法)
- 它对 Object.create(null) 创建的对象也完全兼容,不会报错
为什么不用 obj.hasOwnProperty('key')?
虽然传统写法常见,但它有明显隐患:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- hasOwnProperty 是定义在 Object.prototype 上的方法,一旦被覆盖或删除,调用就会失败
- 像 const obj = Object.create(null) 这类无原型的对象,根本没这个方法,直接调用会报
TypeError - 为保安全,你得写成 Object.prototype.hasOwnProperty.call(obj, 'key'),冗长且易出错
对比 in 操作符:查找范围不同
'key' in obj 和 Object.hasOwn(obj, 'key') 容易混淆,但语义完全不同:
立即学习“Java免费学习笔记(深入)”;
-
in检查的是整个原型链,只要某一级上有该属性,就返回 true -
Object.hasOwn只看对象自身,完全忽略原型上的同名属性 - 例如:一个对象继承了
a: 1,自己定义了b: 2,那么'a' in obj → true,但Object.hasOwn(obj, 'a') → false
实际调试小技巧
开发中快速验证时,可以结合 Object.keys() 和 Object.getOwnPropertyNames():
- Object.keys(obj) 返回所有可枚举的自有属性键(不含 Symbol,也不含不可枚举属性)
- Object.getOwnPropertyNames(obj) 返回所有自有属性键(包括不可枚举的,但不含 Symbol)
- Object.getOwnPropertySymbols(obj) 获取自有 Symbol 属性
- 这些结果里的键,全都能被 Object.hasOwn(obj, key) 安全确认为自有属性

















