undefined abfangen: Detektivarbeit bei JavaScript-Objekteigenschaften

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum stürzt Ihr Code mit "undefined" ab?

\n\n

Sie schreiben Code, alles scheint logisch, und plötzlich – TypeError: Cannot read properties of undefined. Kommt Ihnen bekannt vor? Dieser Fehler ist der Albtraum jedes Anfängers und ein häufiger Gast auf Stack Overflow. Das Thema "Detecting an undefined object property" hat tausende Aufrufe – und das aus gutem Grund.

\n\n

Objekte in JavaScript sind wie Überraschungseier. Sie wissen nie genau, ob die gewünschte Eigenschaft wirklich vorhanden ist, besonders wenn das Objekt von einer API, einer Datenbank oder einem anderen Entwickler stammt. Heute werden wir zu echten Detektiven und untersuchen alle Methoden, um undefined auf frischer Tat zu ertappen. Sie erfahren, wie sich undefined von null unterscheidet, wann Sie typeof und wann hasOwnProperty verwenden sollten, und wie modernes JavaScript uns das Leben erleichtert.

\n\n

Los geht's! 🚀

\n\n

Was ist undefined eigentlich?

\n\n

Bevor wir undefined fangen, sollten wir verstehen, um was für ein Wesen es sich handelt. In JavaScript ist undefined ein primitiver Wert, der automatisch einer Variable zugewiesen wird, wenn ihr kein Wert zugewiesen wurde. Bei Objekten ist die Sache jedoch kniffliger.

\n\n

Eine Objekteigenschaft kann in zwei Fällen undefined sein:

\n
    \n
  • Die Eigenschaft existiert, aber ihr Wert wurde explizit auf undefined gesetzt.
  • \n
  • Die Eigenschaft existiert im Objekt gar nicht.
  • \n
\n\n

Und hier wird es spannend. Für externen Code sehen beide Fälle gleich aus: Beim Versuch, eine nicht vorhandene Eigenschaft zu lesen, erhalten Sie undefined. Für Ihre Logik kann der Unterschied jedoch entscheidend sein.

\n\n
const user = {\n    name: 'Anna',\n    age: undefined, // Eigenschaft vorhanden, Wert ist undefined\n    // city: nicht deklariert\n};\n\nconsole.log(user.age);  // undefined\nconsole.log(user.city); // undefined
\n\n

Beide Aufrufe geben undefined zurück, aber das erste – weil es so gesetzt wurde, das zweite – weil die Eigenschaft fehlt. Wie unterscheidet man das? Lesen Sie weiter.

\n\n

Methode 1: Der typeof-Operator – die gute alte Methode

\n\n

Der einfachste und sicherste Weg, eine Eigenschaft zu prüfen, ist die Verwendung von typeof. Dieser Operator löst niemals einen Fehler aus, selbst wenn Sie auf eine nicht vorhandene Eigenschaft zugreifen.

\n\n
const book = {\n    title: 'Meister und Margarita',\n    author: 'Bulgakow'\n};\n\nif (typeof book.year !== 'undefined') {\n    console.log('Erscheinungsjahr:', book.year);\n} else {\n    console.log('Eigenschaft year nicht gefunden');\n}\n// Ausgabe: Eigenschaft year nicht gefunden
\n\n

Vorteile: Sicher, funktioniert in allen Browsern, erfordert keine zusätzlichen Methoden.

\n

Nachteile: Unterscheidet nicht zwischen einer vorhandenen Eigenschaft mit dem Wert undefined und einer nicht vorhandenen Eigenschaft. Wenn book.year = undefined ist, zeigt typeof trotzdem 'undefined' an.

\n\n

Wann typeof verwenden?

\n

Ideal für schnelle Prüfungen, wenn Sie nur einen Fehler vermeiden wollen und der feine Unterschied zwischen "Eigenschaft vorhanden, aber undefined" und "Eigenschaft nicht vorhanden" unwichtig ist. Besonders nützlich für globale Variablen.

\n\n

Methode 2: Der in-Operator – der Existenzdetektor

\n\n

Der in-Operator prüft, ob eine Eigenschaft in einem Objekt existiert, einschließlich geerbter Eigenschaften. Er gibt true oder false zurück, je nachdem, ob die Eigenschaft in der Prototypenkette vorhanden ist.

\n\n
const car = {\n    brand: 'Tesla',\n    model: 'Model 3'\n};\n\nconsole.log('brand' in car); // true\nconsole.log('year' in car);  // false\nconsole.log('toString' in car); // true (von Object.prototype geerbt)
\n\n

Beachten Sie: in gibt true zurück, selbst wenn die Eigenschaft den Wert undefined hat:

\n\n
const config = {\n    debug: undefined\n};\n\nconsole.log('debug' in config); // true – Eigenschaft existiert                

Blogs

Buchempfehlungen