The Object.hasOwn()
static method returns true
if the specified object has the indicated property as its own property. If the property is inherited, or does not exist, the method returns false
.
Parameters
-
obj
-
The JavaScript object instance to test.
-
prop
-
The String
name or Symbol of the property to test.
Return value
true
if the specified object has directly defined the specified property. Otherwise false
Description
The Object.hasOwn()
method returns true
if the specified property is a direct property of the object — even if the property value is null
or undefined
. The method returns false
if the property is inherited, or has not been declared at all. Unlike the in
operator, this method does not check for the specified property in the object's prototype chain.
It is recommended over Object.prototype.hasOwnProperty()
because it works for null
-prototype objects and with objects that have overridden the inherited hasOwnProperty()
method. While it is possible to workaround these problems by calling Object.prototype.hasOwnProperty()
on an external object, Object.hasOwn()
is more intuitive.
Using hasOwn to test for a property's existence
The following code shows how to determine whether the example
object contains a property named prop
.
const example = {};
Object.hasOwn(example, "prop");
example.prop = "exists";
Object.hasOwn(example, "prop");
example.prop = null;
Object.hasOwn(example, "prop");
example.prop = undefined;
Object.hasOwn(example, "prop");
Direct vs. inherited properties
The following example differentiates between direct properties and properties inherited through the prototype chain:
const example = {};
example.prop = "exists";
Object.hasOwn(example, "prop");
Object.hasOwn(example, "toString");
Object.hasOwn(example, "hasOwnProperty");
"prop" in example;
"toString" in example;
"hasOwnProperty" in example;
Iterating over the properties of an object
To iterate over the enumerable properties of an object, you should use:
const example = { foo: true, bar: true };
for (const name of Object.keys(example)) {
}
But if you need to use for...in
, you can use Object.hasOwn()
to skip the inherited properties:
const example = { foo: true, bar: true };
for (const name in example) {
if (Object.hasOwn(example, name)) {
}
}
Checking if an Array index exists
The elements of an Array
are defined as direct properties, so you can use hasOwn()
method to check whether a particular index exists:
const fruits = ["Apple", "Banana", "Watermelon", "Orange"];
Object.hasOwn(fruits, 3);
Object.hasOwn(fruits, 4);
Problematic cases for hasOwnProperty
This section demonstrates that hasOwn()
is immune to the problems that affect hasOwnProperty
. Firstly, it can be used with objects that have reimplemented hasOwnProperty()
:
const foo = {
hasOwnProperty() {
return false;
},
bar: "The dragons be out of office",
};
if (Object.hasOwn(foo, "bar")) {
console.log(foo.bar);
}
It can also be used with null
-prototype objects. These do not inherit from Object.prototype
, and so hasOwnProperty()
is inaccessible.
const foo = Object.create(null);
foo.prop = "exists";
if (Object.hasOwn(foo, "prop")) {
console.log(foo.prop);
}
Specifications
Browser compatibility
|
Desktop |
Mobile |
Server |
|
Chrome |
Edge |
Firefox |
Opera |
Safari |
Chrome Android |
Firefox for Android |
Opera Android |
Safari on IOS |
Samsung Internet |
WebView Android |
Deno |
Node.js |
hasOwn |
93 |
93 |
92 |
79 |
15.4 |
93 |
92 |
66 |
15.4 |
17.0 |
93 |
1.13 |
16.9.0 |