HOWTO · JavaScript
Überprüfen Sie, ob ein Wert in JavaScript ein Objekt ist
In diesem Tutorial prüfen wir, ob ein Wert ein Objekt in JavaScript ist
Auf dieser Seite
Um zu prüfen, ob ein JavaScript-Wert ein Objekt ist, verwenden Sie typeof value === "object" && value !== null. Diese Bedingung erfasst Arrays und andere Objekte, schließt aber null und Funktionen aus. Soll Ihr Code auch Funktionen akzeptieren, ergänzen Sie die Bedingung um typeof value === "function". Wählen Sie die Regel passend zu den Anforderungen Ihres Programms: JavaScript behandelt Funktionen als aufrufbare Objekte, während typeof sie separat ausweist.
Mit instanceof prüfen, ob ein Wert in JavaScript ein Objekt ist
instanceof ist ein Operator, der prüft, ob das Prototypobjekt eines Konstruktors in der Prototypkette eines Werts vorkommt. Für ein gewöhnliches Objekt, das in derselben JavaScript-Umgebung erstellt wurde, ist value instanceof Object häufig wahr. Das ist nützlich, wenn Sie prüfen möchten, ob ein Wert eine Instanz eines bestimmten Konstruktors ist, etwa bei value instanceof Date.
Der Operator ist jedoch kein allgemeiner Objekttest. Ein mit Object.create(null) erstelltes Objekt hat kein Object.prototype in seiner Prototypkette und besteht daher instanceof Object nicht. Objekte aus einer anderen Umgebung, etwa einem anderen Browserfenster oder einem iframe, haben ebenfalls andere Konstruktoren und Prototypen. Ein solches Objekt kann deshalb den Test instanceof Object der aktuellen Umgebung nicht bestehen. Wenn Sie in diesen Fällen eine allgemeine Objektprüfung benötigen, verwenden Sie eine auf typeof basierende Bedingung.
Mit typeof prüfen, ob ein Wert in JavaScript ein Objekt ist
typeof ist ein Operator und keine Funktion; der Wert muss daher nicht in Klammern stehen. Bei gewöhnlichen Objekten, einschließlich Arrays, gibt typeof value den Wert "object" zurück. Zwei Sonderfälle sollten Sie beachten: typeof null ergibt ebenfalls "object", während typeof bei einer Funktion "function" zurückgibt. Ein Vergleich allein mit "object" erfasst also null, schließt aber Funktionen aus. Wenn Sie Objekte, aber keine Nullwerte erfassen möchten, prüfen Sie zusätzlich ausdrücklich auf null.
Eine wiederverwendbare Objektprüfung definieren
Diese Bedingung gibt für Objekte, die nicht null sind, true zurück und für Funktionen, primitive Werte sowie null false. Das Beispiel zeigt die Ergebnisse für ein Objekt, einen Nullwert, eine Zahl und eine Funktion.
function isObject(value) {
return value !== null && typeof value === "object";
}
const person = { name: "Ada" };
console.log(isObject(person));
console.log(isObject(null));
console.log(isObject(42));
console.log(isObject(() => {}));
Jeder Aufruf gibt ein boolesches Ergebnis aus; die Reihenfolge entspricht der der Eingabewerte. Diese Definition beantwortet bewusst die Frage: „Ist dies ein Objekt, das nicht null ist?“ Soll eine Funktion in Ihrem Anwendungsfall ebenfalls zählen, verwenden Sie value !== null && (typeof value === "object" || typeof value === "function"). Prüfen Sie dafür nicht value.constructor.toString(): Ein Wert hat möglicherweise nicht den erwarteten Konstruktor, und Konstruktornamen oder Quelltext sind kein zuverlässiger allgemeiner Typentest. Auch das Muster Object(value) === value hat Konvertierungseffekte, die den beabsichtigten Zweck der Prüfung verschleiern können.
Mit Object.getPrototypeOf() den Prototyp eines Objekts untersuchen
Object.getPrototypeOf(value) beantwortet eine andere Frage: Die Methode gibt den Prototyp eines Objekts zurück. Beispielsweise liefert Object.getPrototypeOf(Object.create(null)) den Wert null, während Object.getPrototypeOf({}) Object.prototype zurückgibt. Damit können Sie die Vererbung untersuchen oder den Prototyp eines Werts mit einem bekannten Prototyp vergleichen. Die Methode ersetzt jedoch keine Objektprüfung. Wird null oder undefined an Object.getPrototypeOf() übergeben, tritt ein TypeError auf; andere primitive Werte werden in Objekte umgewandelt, bevor ihr Prototyp zurückgegeben wird. Verwenden Sie diese Methode nur, wenn Sie einen Prototyp untersuchen möchten, nicht als allgemeine Objektprüfung.