object.hasown是es2022引入的推荐替代hasownproperty的安全方法,可直接判断对象自身是否具有指定属性(不查原型链),避免属性覆盖和绑定冗余问题,支持普通对象、null原型对象及类数组对象,且兼容symbol属性。

Object.hasOwn 是 ES2022 引入的静态方法,用于安全、直接地判断对象自身是否具有指定属性(不查找原型链),是 obj.hasOwnProperty(prop) 的推荐替代方案。
为什么推荐用 Object.hasOwn?
传统 hasOwnProperty 有两大隐患:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 如果对象自身定义了名为
hasOwnProperty的属性(哪怕值为undefined),调用obj.hasOwnProperty(prop)会报错或返回错误结果; - 需要手动绑定
Object.prototype.hasOwnProperty.call(obj, prop)才能确保安全,写法冗长且易被忽略。
基本用法:直接替换,零兼容成本
语法完全一致,只需把调用主体从实例方法改为静态方法:
❌ 旧写法(有风险)user.hasOwnProperty('name'){}.hasOwnProperty.call(user, 'name')
✅ 新写法(推荐)Object.hasOwn(user, 'name')Object.hasOwn({}, 'toString') // false —— 不查原型
支持所有普通对象和类数组对象
它适用于:
– 普通对象、Object.create(null) 创建的对象(没有原型,hasOwnProperty 根本不可用);
– 数组、Map/WeakMap 的键名检查需配合 Object.keys 等,但 Object.hasOwn 本身只用于自有属性;
– 类数组对象(如 arguments)也适用:
function test() {<br>
console.log(Object.hasOwn(arguments, '0')); // true<br>
console.log(Object.hasOwn(arguments, 'length')); // true<br>
}
注意:不替代 in 操作符或 Object.keys
Object.hasOwn 只判断「自身 + 可枚举/不可枚举」属性(包括 Object.defineProperty 设置的 enumerable: false 属性),但它:
- ≠
prop in obj(后者查原型链); - ≠
Object.keys(obj).includes(prop)(后者只查可枚举属性); - 对 Symbol 属性同样有效:
Object.hasOwn(obj, Symbol('id'))。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










