object.hasown 是 es2022 引入的安全、精准、可靠的静态方法,用于判断对象自身是否拥有指定属性(含不可枚举属性),避免原型链查找和 hasownproperty 被污染问题,兼容性良好且支持 polyfill。

Object.hasOwn 是 ES2022 引入的原生方法,用于替代 Object.prototype.hasOwnProperty.call(obj, prop),它能更安全、更直接地判断对象自身是否拥有指定属性(不包括原型链上的属性)。
为什么需要 Object.hasOwn 而不是 in 或 hasOwnProperty?
in 操作符会查找整个原型链,容易误判继承属性;obj.hasOwnProperty(prop) 在 obj 为 null 或 undefined 时会报错,且当对象自身重写了 hasOwnProperty 方法时结果不可靠。而 Object.hasOwn(obj, prop) 是静态方法,不依赖对象原型,能正确处理 null/undefined,并绕过被污染的 hasOwnProperty。
- ✅ 安全:传入
null或undefined返回false,不会抛错 - ✅ 精准:只检查对象自身属性,无视原型链
- ✅ 可靠:不调用对象上的任何方法,避免被覆盖或拦截
在 for...in 循环中过滤掉继承属性
传统写法常配合 hasOwnProperty 做防护,但易出错。使用 Object.hasOwn 更简洁明确:
const obj = { a: 1 };
Object.setPrototypeOf(obj, { b: 2 });
for (const key in obj) {
if (Object.hasOwn(obj, key)) {
console.log(key); // 只输出 'a'
}
}
这样就能确保只枚举对象自身的可枚举属性,避免意外遍历到原型上的属性。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
替代 Object.keys + includes 的低效写法
有人习惯先取所有键再判断:Object.keys(obj).includes(prop),但这会创建新数组,性能差且无法检测不可枚举属性。而 Object.hasOwn 直接查内部属性描述符,支持所有自有属性(包括不可枚举的):
- ✔️ 检测不可枚举属性(如通过
Object.defineProperty设置的enumerable: false属性) - ✔️ 不创建中间数组,时间复杂度 O(1)
- ✔️ 语义清晰:就是“这个对象自己有没有这个属性?”
兼容性与降级建议
Object.hasOwn 已被 Chrome 98+、Firefox 97+、Safari 16.4+ 和 Node.js 16.14+ 原生支持。若需兼容旧环境,可用 polyfill:
if (!Object.hasOwn) {
Object.hasOwn = Function.call.bind(Object.prototype.hasOwnProperty);
}
该 polyfill 行为与原生一致,且比手动 call 更简洁安全。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










