object.hasown 是 es2022 引入的可靠方法,用于检查对象是否拥有指定自有属性;它不依赖对象自身或原型链上的 hasownproperty 方法,避免因覆盖或污染导致的错误,参数为对象和属性键,返回布尔值。

Object.hasOwn 是 ES2022 引入的标准化方法,用于安全、简洁地检查对象是否拥有指定的**自有属性**(即非继承属性),它正是为替代 obj.hasOwnProperty(prop) 而设计的,解决了后者在对象自身重写了 hasOwnProperty 方法或原型链上被污染时可能失效的问题。
为什么推荐用 Object.hasOwn 而不是 hasOwnProperty
传统写法 obj.hasOwnProperty(prop) 依赖对象原型上的 hasOwnProperty 方法。如果对象本身定义了同名属性(如 { hasOwnProperty: true }),或其原型被篡改(比如 Object.prototype.hasOwnProperty = null),调用就会出错或返回错误结果。
而 Object.hasOwn(obj, prop) 是静态方法,不依赖目标对象的任何内部状态,始终可靠。
基本用法:两参数,返回布尔值
语法统一为:Object.hasOwn(targetObject, propertyKey),接收两个参数:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
targetObject:要检查的对象(可为
null或undefined,此时自动返回false) - propertyKey:属性名(字符串或 Symbol)
示例:
const obj = { name: 'Alice', age: 30 };<br>Object.hasOwn(obj, 'name'); // true<br>Object.hasOwn(obj, 'toString'); // false(继承自 Object.prototype)<br>Object.hasOwn(obj, 'hasOwnProperty'); // false(未定义该自有属性)<br><br>// 即使对象覆盖了 hasOwnProperty,也不影响 Object.hasOwn<br>const badObj = { hasOwnProperty: 'hacked' };<br>Object.hasOwn(badObj, 'hasOwnProperty'); // true ✅<br>// 而 badObj.hasOwnProperty('hasOwnProperty') 会报错 ❌
兼容性与降级建议
目前主流浏览器(Chrome 93+、Firefox 92+、Safari 15.4+)及 Node.js 16.9+ 均原生支持。
若需支持更老环境,可用简单 polyfill:
if (!Object.hasOwn) {<br> Object.hasOwn = Object.prototype.hasOwnProperty.call.bind(<br> Object.prototype.hasOwnProperty<br> );<br>}
注意:不要直接赋值 Object.hasOwn = Object.prototype.hasOwnProperty,因为后者是未绑定的方法,直接调用会丢失 this 上下文。
常见误用提醒
- 不支持数组索引作为“属性名”的语义化检查(例如
Object.hasOwn([1,2], '0')返回true,因为数组索引本质就是字符串键,这其实是符合预期的) - 不检测
undefined或null值的属性是否存在——它只管“键是否存在”,不管值是否为undefined - 不能替代
in操作符:后者检查**自有 + 继承**属性,Object.hasOwn只查自有
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










