此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。
Object.hasOwn()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2022年3月.
如果指定的对象自身有指定的属性,则静态方法Object.hasOwn() 返回true。如果属性是继承的或者不存在,该方法返回false。
备注:Object.hasOwn() 旨在取代Object.prototype.hasOwnProperty()。
In this article
尝试一下
const object1 = { prop: "exists",};console.log(Object.hasOwn(object1, "prop"));// Expected output: trueconsole.log(Object.hasOwn(object1, "toString"));// Expected output: falseconsole.log(Object.hasOwn(object1, "undeclaredPropertyValue"));// Expected output: false语法
Object.hasOwn(obj, prop)参数
返回值
如果指定的对象中直接定义了指定的属性,则返回true;否则返回false。
描述
如果指定的属性是该对象的直接属性——Object.hasOwn() 方法返回true,即使属性值是null 或undefined。如果属性是继承的或者不存在,该方法返回false。它不像in 运算符,这个方法不检查对象的原型链中的指定属性。
建议使用此方法替代Object.prototype.hasOwnProperty(),因为它适用于使用Object.create(null) 创建的对象,以及重写了继承的hasOwnProperty() 方法的对象。尽管可以通过在外部对象上调用Object.prototype.hasOwnProperty() 解决这些问题,但是Object.hasOwn() 更加直观。
示例
>使用 hasOwn 去测试属性是否存在
以下代码展示了如何确定example 对象中是否包含名为prop 的属性。
const example = {};Object.hasOwn(example, "prop"); // false——目标对象的属性 'prop' 未被定义example.prop = "exists";Object.hasOwn(example, "prop"); // true——目标对象的属性 'prop' 已被定义example.prop = null;Object.hasOwn(example, "prop"); // true——目标对象本身的属性存在,值为 nullexample.prop = undefined;Object.hasOwn(example, "prop"); // true——目标对象本身的属性存在,值为 undefined直接属性和继承属性
以下示例区分了直接属性和通过原型链继承的属性:
const example = {};example.prop = "exists";// `hasOwn` 静态方法只会对目标对象的直接属性返回 true:Object.hasOwn(example, "prop"); // 返回 trueObject.hasOwn(example, "toString"); // 返回 falseObject.hasOwn(example, "hasOwnProperty"); // 返回 false// `in` 运算符对目标对象的直接属性或继承属性均会返回 true:"prop" in example; // 返回 true"toString" in example; // 返回 true"hasOwnProperty" in example; // 返回 true迭代对象的属性
要迭代对象的可枚举属性,你应该这样使用:
const example = { foo: true, bar: true };for (const name of Object.keys(example)) { // …}但是如果你使用for...in,你应该使用Object.hasOwn() 跳过继承属性:
const example = { foo: true, bar: true };for (const name in example) { if (Object.hasOwn(example, name)) { // … }}检查数组索引是否存在
Array 中的元素被定义为直接属性,所以你可以使用hasOwn() 方法去检查一个指定的索引是否存在:
const fruits = ["Apple", "Banana", "Watermelon", "Orange"];Object.hasOwn(fruits, 3); // true ('Orange')Object.hasOwn(fruits, 4); // false——没有定义的hasOwnProperty 的问题案例
本部分证明了影响hasOwnProperty 的问题对hasOwn() 是免疫的。首先,它可以与重新实现的hasOwnProperty() 一起使用:
const foo = { hasOwnProperty() { return false; }, bar: "The dragons be out of office",};if (Object.hasOwn(foo, "bar")) { console.log(foo.bar); //true——重新实现 hasOwnProperty() 不会影响 Object}它也可以用于测试使用Object.create(null) 创建的对象。这些对象不会继承自Object.prototype,因此hasOwnProperty() 方法是无法访问的。
const foo = Object.create(null);foo.prop = "exists";if (Object.hasOwn(foo, "prop")) { console.log(foo.prop); //true——无论对象是如何创建的,它都可以运行。}规范
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-object.hasown> |