TypeScript - null vs. undefined

Hallo, angehende Programmierer! Heute tauchen wir in ein spannendes Thema ein, das oft Anfänger verwirrt: den Unterschied zwischen null und undefined in TypeScript. Machen Sie sich keine Sorgen, wenn Sie sich etwas überwältigt fühlen – ich erinnere mich, als ich zum ersten Mal auf diese Konzepte gestoßen bin, habe ich auch mit dem Kopf geschüttelt! Aber am Ende dieses Lektions werden Sie ein Profi im Unterscheiden zwischen diesen beiden besonderen Werten sein. Los geht's!

TypeScript - null vs. undefined

Was ist null?

In TypeScript (und JavaScript) ist null ein besonderer Wert, der die absichtliche Abwesenheit eines Objektwertes darstellt. Es ist so, als würde man sagen: "Hey, hier sollte etwas sein, aber im Moment ist hier nichts."

Schauen wir uns einige Beispiele an, um dies besser zu verstehen:

let meinHaustier: string | null = null;
console.log(meinHaustier); // Ausgabe: null

// Später im Code...
meinHaustier = "Fluffy";
console.log(meinHaustier); // Ausgabe: Fluffy

In diesem Beispiel deklarieren wir eine Variable meinHaustier, die entweder eine Zeichenkette oder null sein kann. Initially, setzen wir sie auf null, was bedeutet, dass wir noch kein Haustier haben. Später, wenn wir ein Haustier bekommen, weisen wir den Namen "Fluffy" meinHaustier zu.

Hier ist ein weiteres Beispiel:

function findeBenutzer(id: number): { name: string } | null {
// Stell dir vor, wir durchsuchen eine Datenbank
if (id === 1) {
return { name: "Alice" };
} else {
return null;
}
}

let benutzer = findeBenutzer(1);
console.log(benutzer); // Ausgabe: { name: "Alice" }

benutzer = findeBenutzer(2);
console.log(benutzer); // Ausgabe: null

In diesem Fall gibt unsere findeBenutzer-Funktion entweder ein Benutzerobjekt oder null zurück, wenn kein Benutzer gefunden wird. Dies ist ein gängiges Muster in der Programmierung – die Verwendung von null, um anzuzeigen, dass eine Suche oder Operation kein Ergebnis geliefert hat.

Was ist undefined?

Nun, lassen Sie uns über undefined sprechen. Dieser besondere Wert stellt eine Variable dar, die deklariert, aber noch keinen Wert zugewiesen wurde. Es ist wie eine leere Box – sie existiert, aber es ist noch nichts drin.

Hier sind einige Beispiele, um undefined zu verdeutlichen:

let meinName: string;
console.log(meinName); // Ausgabe: undefined

// Später im Code...
meinName = "John";
console.log(meinName); // Ausgabe: John

function grüße(name?: string) {
console.log(name);
}

grüße(); // Ausgabe: undefined
grüße("Alice"); // Ausgabe: Alice

Im ersten Teil deklarieren wir meinName, aber wir weisen ihm keinen Wert zu. TypeScript weist ihm automatisch den Wert undefined zu. Später weisen wir einen Wert zu, und er ist nicht mehr undefined.

In der grüße-Funktion verwenden wir einen optionalen Parameter. Wenn wir die Funktion ohne Argument aufrufen, wird der name-Parameter undefined.

Hier ist ein weiteres Szenario, bei dem Sie undefined antreffen könnten:

let person = {
name: "Bob",
age: 30
};

console.log(person.name); // Ausgabe: Bob
console.log(person.job); // Ausgabe: undefined

In diesem Fall ist person.job undefined, weil wir nie eine job-Eigenschaft für unser person-Objekt definiert haben.

Null vs. Undefined: Wichtige Unterschiede

Nun, da wir null und undefined einzeln untersucht haben, vergleichen wir sie nebeneinander, um ihre Unterschiede besser zu verstehen.

Aspekt null undefined
Bedeutung Absichtliche Abwesenheit eines Objektwertes Variabel deklariert, aber kein Wert zugewiesen
Typ Objekt Undefined
In JSON Gültig Ungültig
Standardparameter für Funktionen Wird nicht als Standard verwendet Wird als Standard für optionale Parameter verwendet
Gleichheit null == undefined (wahr), null === undefined (falsch) undefined == null (wahr), undefined === null (falsch)

Schauen wir uns einige Codebeispiele an, um diese Unterschiede zu verdeutlichen:

// Typüberprüfung
console.log(typeof null);       // Ausgabe: "object"
console.log(typeof undefined);  // Ausgabe: "undefined"

// JSON-Serialisierung
console.log(JSON.stringify({ a: null }));     // Ausgabe: {"a":null}
console.log(JSON.stringify({ a: undefined })); // Ausgabe: {}

// Standardparameter für Funktionen
function sageHallo(name: string = "World") {
console.log(`Hallo, ${name}!`);
}

sageHallo();        // Ausgabe: Hallo, World!
sageHallo(undefined); // Ausgabe: Hallo, World!
sageHallo(null);    // Ausgabe: Hallo, null!

// Gleichheit
console.log(null == undefined);  // Ausgabe: true
console.log(null === undefined); // Ausgabe: false

In der Praxis hängt die Wahl zwischen null und undefined oft von persönlicher oder Teampräferenz ab. Das Verständnis der Unterschiede kann jedoch dabei helfen, präzisere und bugfreie Code zu schreiben.

Hier ist ein letztes Beispiel, um alles zusammenzufassen:

function verarbeiteBenutzer(benutzer: { name: string, age?: number } | null | undefined) {
if (benutzer === null) {
console.log("Benutzer explizit auf null gesetzt");
} else if (benutzer === undefined) {
console.log("Benutzer nicht bereitgestellt");
} else {
console.log(`Verarbeite Benutzer: ${benutzer.name}, Alter: ${benutzer.age ?? "Unbekannt"}`);
}
}

verarbeiteBenutzer(null);                    // Ausgabe: Benutzer explizit auf null gesetzt
verarbeiteBenutzer(undefined);               // Ausgabe: Benutzer nicht bereitgestellt
verarbeiteBenutzer({ name: "Alice" });       // Ausgabe: Verarbeite Benutzer: Alice, Alter: Unbekannt
verarbeiteBenutzer({ name: "Bob", age: 30 }); // Ausgabe: Verarbeite Benutzer: Bob, Alter: 30

Diese Funktion zeigt, wie wir null, undefined und gültige Benutzerobjekte in einer realen Welt-Situation unterschiedlich behandeln könnten.

Und das war's! Sie haben gerade die Ins und Outs von null und undefined in TypeScript gelernt. Denken Sie daran, Übung macht den Meister, also fürchten Sie sich nicht, diese Konzepte in Ihrem eigenen Code auszuprobieren. Frohes Coden und möge Ihre Variablen stets absichtlich null oder undefined sein!

Credits: Image by storyset