Object.hasOwn()

Object.hasOwn() 静态方法如果指定对象具有指示的属性作为其自身属性,则返回 true。如果属性是继承的,或者不存在,则该方法返回 false

注意:Object.hasOwn() 旨在替代 Object.prototype.hasOwnProperty()

试试看

语法

js
Object.hasOwn(obj, prop)

参数

obj

要测试的 JavaScript 对象实例。

prop

要测试的属性的String 名称或Symbol

返回值

如果指定对象直接定义了指定属性,则为 true。否则为 false

描述

如果指定的属性是对象的直接属性,则 Object.hasOwn() 方法返回 true,即使属性值为 nullundefined 也是如此。如果属性是继承的,或者根本没有声明,则该方法返回 false。与in 运算符不同,此方法不会检查对象原型链中的指定属性。

建议使用它而不是 Object.prototype.hasOwnProperty(),因为它适用于null 原型对象 以及已覆盖继承的 hasOwnProperty() 方法的对象。虽然可以通过对外部对象调用 Object.prototype.hasOwnProperty() 来解决这些问题,但 Object.hasOwn() 更直观。

示例

使用 hasOwn 测试属性是否存在

以下代码显示了如何确定 example 对象是否包含名为 prop 的属性。

js
const example = {};
Object.hasOwn(example, "prop"); // false - 'prop' has not been defined

example.prop = "exists";
Object.hasOwn(example, "prop"); // true - 'prop' has been defined

example.prop = null;
Object.hasOwn(example, "prop"); // true - own property exists with value of null

example.prop = undefined;
Object.hasOwn(example, "prop"); // true - own property exists with value of undefined

直接属性与继承属性

以下示例区分了直接属性和通过原型链继承的属性

js
const example = {};
example.prop = "exists";

// `hasOwn` will only return true for direct properties:
Object.hasOwn(example, "prop"); // true
Object.hasOwn(example, "toString"); // false
Object.hasOwn(example, "hasOwnProperty"); // false

// The `in` operator will return true for direct or inherited properties:
"prop" in example; // true
"toString" in example; // true
"hasOwnProperty" in example; // true

迭代对象的属性

要迭代对象的可枚举属性,您应该使用

js
const example = { foo: true, bar: true };
for (const name of Object.keys(example)) {
  // …
}

但是,如果您需要使用 for...in,则可以使用 Object.hasOwn() 跳过继承的属性

js
const example = { foo: true, bar: true };
for (const name in example) {
  if (Object.hasOwn(example, name)) {
    // …
  }
}

检查数组索引是否存在

Array 的元素被定义为直接属性,因此您可以使用 hasOwn() 方法检查特定索引是否存在

js
const fruits = ["Apple", "Banana", "Watermelon", "Orange"];
Object.hasOwn(fruits, 3); // true ('Orange')
Object.hasOwn(fruits, 4); // false - not defined

hasOwnProperty 的问题案例

本节演示了 hasOwn() 如何不受影响 hasOwnProperty 的问题。首先,它可以用于具有重新实现 hasOwnProperty() 的对象

js
const foo = {
  hasOwnProperty() {
    return false;
  },
  bar: "The dragons be out of office",
};

if (Object.hasOwn(foo, "bar")) {
  console.log(foo.bar); // true - re-implementation of hasOwnProperty() does not affect Object
}

它还可以用于null 原型对象。这些对象不继承自 Object.prototype,因此 hasOwnProperty() 无法访问。

js
const foo = Object.create(null);
foo.prop = "exists";
if (Object.hasOwn(foo, "prop")) {
  console.log(foo.prop); // true - works irrespective of how the object is created.
}

规范

规范
ECMAScript 语言规范
# sec-object.hasown

浏览器兼容性

BCD 表格仅在启用了 JavaScript 的浏览器中加载。

另请参阅