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 March 2022.
Die statische Methode Object.hasOwn()
gibt true
zurück, wenn das angegebene Objekt die angegebene Eigenschaft als eigene Eigenschaft besitzt. Wenn die Eigenschaft geerbt ist oder nicht existiert, gibt die Methode false
zurück.
Note:
Object.hasOwn()
ist als Ersatz fürObject.prototype.hasOwnProperty()
gedacht.
Probieren Sie es aus
const object1 = {
prop: "exists",
};
console.log(Object.hasOwn(object1, "prop"));
// Expected output: true
console.log(Object.hasOwn(object1, "toString"));
// Expected output: false
console.log(Object.hasOwn(object1, "undeclaredPropertyValue"));
// Expected output: false
Syntax
Object.hasOwn(obj, prop)
Parameter
Rückgabewert
true
, wenn das angegebene Objekt die angegebene Eigenschaft direkt definiert hat. Andernfalls false
.
Beschreibung
Die Methode Object.hasOwn()
gibt true
zurück, wenn die angegebene Eigenschaft eine direkte Eigenschaft des Objekts ist — auch wenn der Eigenschaftswert null
oder undefined
ist. Die Methode gibt false
zurück, wenn die Eigenschaft geerbt wurde oder gar nicht deklariert wurde. Im Gegensatz zum in
-Operator prüft diese Methode nicht die angegebene Eigenschaft in der Prototypenkette des Objekts.
Sie wird über Object.prototype.hasOwnProperty()
empfohlen, da sie für null
-Prototyp-Objekte und mit Objekten funktioniert, die die geerbte hasOwnProperty()
-Methode überschrieben haben. Obwohl es möglich ist, diese Probleme zu umgehen, indem man Object.prototype.hasOwnProperty()
auf einem anderen Objekt aufruft (wie Object.prototype.hasOwnProperty.call(obj, prop)
), ist Object.hasOwn()
intuitiver und prägnanter.
Beispiele
Verwendung von Object.hasOwn() zur Prüfung auf Vorhandensein einer Eigenschaft
Der folgende Code zeigt, wie festgestellt werden kann, ob das example
-Objekt eine Eigenschaft namens prop
enthält.
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
Direkte vs. geerbte Eigenschaften
Das folgende Beispiel unterscheidet zwischen direkten Eigenschaften und über die Prototypenkette geerbten Eigenschaften:
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
Iterieren über die Eigenschaften eines Objekts
Um über die aufzählbaren Eigenschaften eines Objekts zu iterieren, sollten Sie verwenden:
const example = { foo: true, bar: true };
for (const name of Object.keys(example)) {
// …
}
Aber wenn Sie for...in
verwenden müssen, können Sie Object.hasOwn()
verwenden, um die geerbten Eigenschaften zu überspringen:
const example = { foo: true, bar: true };
for (const name in example) {
if (Object.hasOwn(example, name)) {
// …
}
}
Prüfen, ob ein Array-Index existiert
Die Elemente eines Array
sind als direkte Eigenschaften definiert, sodass Sie die hasOwn()
-Methode verwenden können, um zu überprüfen, ob ein bestimmter Index existiert:
const fruits = ["Apple", "Banana", "Watermelon", "Orange"];
Object.hasOwn(fruits, 3); // true ('Orange')
Object.hasOwn(fruits, 4); // false - not defined
Problematische Fälle für hasOwnProperty()
In diesem Abschnitt wird gezeigt, dass Object.hasOwn()
immun gegen die Probleme ist, die hasOwnProperty()
beeinflussen. Erstens kann es mit Objekten verwendet werden, die hasOwnProperty()
neu implementiert haben. Im untenstehenden Beispiel meldet die neu implementierte hasOwnProperty()
-Methode für jede Eigenschaft false
, aber das Verhalten von Object.hasOwn()
bleibt davon unbeeinflusst:
const foo = {
hasOwnProperty() {
return false;
},
bar: "The dragons be out of office",
};
console.log(foo.hasOwnProperty("bar")); // false
console.log(Object.hasOwn(foo, "bar")); // true
Es kann auch mit null
-Prototyp-Objekten verwendet werden. Diese erben nicht von Object.prototype
, und daher ist hasOwnProperty()
nicht zugänglich.
const foo = Object.create(null);
foo.prop = "exists";
console.log(foo.hasOwnProperty("prop"));
// Uncaught TypeError: foo.hasOwnProperty is not a function
console.log(Object.hasOwn(foo, "prop")); // true
Spezifikationen
Specification |
---|
ECMAScript® 2026 Language Specification # sec-object.hasown |