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')?
虽然传统写法常见,但它有明显隐患:
- hasOwnProperty 是定义在 Object.prototype 上的方法,一旦被覆盖或删除,调用就会失败
- 像 const obj = Object.create(null) 这类无原型的对象,根本没这个方法,直接调用会报
TypeError - 为保安全,你得写成 Object.prototype.hasOwnProperty.call(obj, 'key'),冗长且易出错
对比 in 操作符:查找范围不同
'key' in obj 和 Object.hasOwn(obj, 'key') 容易混淆,但语义完全不同:
-
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) 安全确认为自有属性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











