Object.hasOwn()
Object.hasOwn()
静态方法如果指定对象具有指示的属性作为其自身属性,则返回 true
。如果属性是继承的,或者不存在,则该方法返回 false
。
注意:Object.hasOwn()
旨在替代 Object.prototype.hasOwnProperty()
。
试试看
语法
Object.hasOwn(obj, prop)
参数
返回值
如果指定对象直接定义了指定属性,则为 true
。否则为 false
描述
如果指定的属性是对象的直接属性,则 Object.hasOwn()
方法返回 true
,即使属性值为 null
或 undefined
也是如此。如果属性是继承的,或者根本没有声明,则该方法返回 false
。与in
运算符不同,此方法不会检查对象原型链中的指定属性。
建议使用它而不是 Object.prototype.hasOwnProperty()
,因为它适用于null
原型对象 以及已覆盖继承的 hasOwnProperty()
方法的对象。虽然可以通过对外部对象调用 Object.prototype.hasOwnProperty()
来解决这些问题,但 Object.hasOwn()
更直观。
示例
使用 hasOwn 测试属性是否存在
以下代码显示了如何确定 example
对象是否包含名为 prop
的属性。
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
直接属性与继承属性
以下示例区分了直接属性和通过原型链继承的属性
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
迭代对象的属性
要迭代对象的可枚举属性,您应该使用
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 - not defined
hasOwnProperty 的问题案例
本节演示了 hasOwn()
如何不受影响 hasOwnProperty
的问题。首先,它可以用于具有重新实现 hasOwnProperty()
的对象
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()
无法访问。
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 的浏览器中加载。