Object.prototype.hasOwnProperty()

hasOwnProperty()Object 实例的方法,它返回一个布尔值,指示该对象是否拥有指定的属性作为其自身属性(而不是继承自原型链)。

注意:在支持的浏览器中,建议使用 Object.hasOwn() 而不是 hasOwnProperty()

试一试

语法

js
hasOwnProperty(prop)

参数

prop

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

返回值

如果对象拥有指定的属性作为自身属性,则返回 true;否则返回 false

描述

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

该方法可以被大多数 JavaScript 对象调用,因为大多数对象都继承自 Object,因此继承了其方法。例如,Array 是一个 Object,因此您可以使用 hasOwnProperty() 方法来检查索引是否存在。

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

在重新实现该方法的对象或 null-原型对象(因为它们不继承自 Object.prototype)中,该方法将不可用。下面给出了这些情况的示例。

示例

使用 hasOwnProperty 测试自身属性的存在

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

js
const example = {};
example.hasOwnProperty("prop"); // false

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

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

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

直接属性与继承属性

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

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

// `hasOwnProperty` will only return true for direct properties:
example.hasOwnProperty("prop"); // true
example.hasOwnProperty("toString"); // false
example.hasOwnProperty("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 buz = {
  fog: "stack",
};

for (const name in buz) {
  if (buz.hasOwnProperty(name)) {
    console.log(`this is fog (${name}) for sure. Value: ${buz[name]}`);
  } else {
    console.log(name); // toString or something else
  }
}

请注意,for...in 循环仅迭代可枚举项:循环中未发出不可枚举属性并不意味着 hasOwnProperty 本身严格限于可枚举项。您可以使用 Object.getOwnPropertyNames() 遍历不可枚举属性。

使用 hasOwnProperty 作为属性名称

JavaScript 不会保护属性名称 hasOwnProperty;具有此名称属性的对象可能会返回不正确的结果。

js
const foo = {
  hasOwnProperty() {
    return false;
  },
  bar: "Here be dragons",
};

foo.hasOwnProperty("bar"); // re-implementation always returns false

解决此问题的推荐方法是改用 Object.hasOwn()(在支持它的浏览器中)。其他替代方案包括使用外部 hasOwnProperty

js
const foo = { bar: "Here be dragons" };

// Use Object.hasOwn() method - recommended
Object.hasOwn(foo, "bar"); // true

// Use the hasOwnProperty property from the Object prototype
Object.prototype.hasOwnProperty.call(foo, "bar"); // true

// Use another Object's hasOwnProperty
// and call it with 'this' set to foo
({}).hasOwnProperty.call(foo, "bar"); // true

请注意,在前两种情况下,没有新创建的对象。

使用 Object.create(null) 创建的对象

null-原型对象 不继承自 Object.prototype,因此无法访问 hasOwnProperty()

js
const foo = Object.create(null);
foo.prop = "exists";
foo.hasOwnProperty("prop"); // Uncaught TypeError: foo.hasOwnProperty is not a function

在这种情况下,解决方案与上一节相同:优先使用 Object.hasOwn(),否则使用外部对象的 hasOwnProperty()

规范

规范
ECMAScript 语言规范
# sec-object.prototype.hasownproperty

浏览器兼容性

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

另请参阅