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 July 2015.
如果指定的对象自身有指定的属性,则静态方法 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()
,因为它适用于使用 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——目标对象本身的属性存在,值为 null
example.prop = undefined;
Object.hasOwn(example, "prop"); // true——目标对象本身的属性存在,值为 undefined
直接属性和继承属性
以下示例区分了直接属性和通过原型链继承的属性:
const example = {};
example.prop = "exists";
// `hasOwn` 静态方法只会对目标对象的直接属性返回 true:
Object.hasOwn(example, "prop"); // 返回 true
Object.hasOwn(example, "toString"); // 返回 false
Object.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 Language Specification # sec-object.hasown |
浏览器兼容性
BCD tables only load in the browser