Im Gegensatz zu vielen anderen Sprachen gibt es in JavaScript zwei verschiedene Dinge, die das Fehlen eines (sinnvollen) Werts darstellen.
Es gibt null und undefined.
Der primitive Wert null wird als absichtlicher „leerer Wert“ für Variablen jedes Typs verwendet.
let name = null;
// name is intentionally set to "empty" because it is not
// available
Du kannst mit dem Operator für strikte Gleichheit === prüfen, ob eine Variable null ist.
let name = null;
name === null;
// => true
Eine Variable, der kein Wert zugewiesen wurde, hat den Typ
undefined.1
Das heißt, während null einen leeren Wert (aber immer noch einen Wert) darstellt, steht undefined für die völlige Abwesenheit eines Werts. 🤯
undefined tritt in verschiedenen Zusammenhängen auf.
undefined.undefined.undefined.undefined, es sei denn, dieses Argument hat einen Standardwert.let name;
console.log(name);
// => undefined
Du kannst mit dem Operator für strikte Gleichheit === prüfen, ob eine Variable undefined ist.
let name;
name === undefined;
// => true
Wenn du versuchst, einen verschachtelten Wert in einem Objekt abzurufen, der übergeordnete Schlüssel aber nicht existiert, wirft JavaScript einen Fehler.
Um das auf einfache Weise zu vermeiden, wurde Optional Chaining im Jahr 2020 zur Sprachspezifikation hinzugefügt.
Mit dem Optional-Chaining-Operator ?. kannst du sicherstellen, dass JavaScript nur dann auf den verschachtelten Schlüssel zuzugreifen versucht, wenn der übergeordnete Schlüssel nicht null oder undefined war.
Andernfalls wird undefined zurückgegeben.
const obj = {
address: {
street: 'Trincomalee Highway',
city: 'Batticaloa',
},
};
obj.address.zipCode;
// => undefined
obj.residence.street;
// => TypeError: Cannot read property 'street' of undefined
obj.residence?.street;
// => undefined
Es gibt Situationen, in denen du einen Standardwert anwenden möchtest, falls eine Variable null oder undefined ist (aber nur dann).
Um das zu ermöglichen, wurde der Nullish-Coalescing-Operator ?? im Jahr 2020 eingeführt.
Er gibt nur dann den rechten Operanden zurück, wenn der linke Operand null oder undefined ist.
Andernfalls wird der linke Operand zurückgegeben.
let amount = null;
amount = amount ?? 1;
// => 1
amount = 0;
amount = amount ?? 1;
// => 0
[1] Undefined, MDN. (2021). https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined (abgerufen am 4. Juni 2021).
Es ist deine Aufgabe, Teile des IT-Systems eines Freizeitparks bereitzustellen und zu warten. Insbesondere bist du für das Programm verantwortlich, das Besucher und Tickets verwaltet.
Zuerst erstellst du einen neuen Besucher im System. Danach stellst du eine Funktion zum Entwerten eines Tickets bereit. In den Aufgaben 3 und 4 arbeitest du am Ticketverfolgungssystem, das dabei hilft, Fälschungen zu verhindern. Zum Schluss hilfst du dabei, das System an neue gesetzliche Anforderungen anzupassen.
Wenn Besucher zum ersten Mal in den Freizeitpark kommen, müssen sie sich registrieren, indem sie ihren Namen und ihr Alter in ein Terminal eingeben und den Allgemeinen Geschäftsbedingungen zustimmen.
Natürlich müssen sie auch ein Ticket kaufen.
Jedes Ticket hat eine Kennung wie H32AZ123.
Schreibe eine Funktion createVisitor, die drei Argumente akzeptiert.
Die Funktion sollte ein Objekt zurückgeben, das diese Informationen enthält.
Die Schlüssel in dem Objekt sollten name, age und ticketId heißen.
createVisitor('Verena Nardi', 45, 'H32AZ123');
// => { name: 'Verena Nardi', age: 45, ticketId: 'H32AZ123' }
Wenn Besucher den Freizeitpark verlassen, wird ihr Ticket entwertet. Wenn sie zurückkommen, müssen sie ein neues kaufen. Um Stammgästen etwas Zeit zu sparen, müssen sie sich nur einmal registrieren, und die Besucherinformationen werden für spätere Besuche aufbewahrt.
Das bedeutet: Wenn ein Besucher den Park verlässt, sollte nur sein Ticket ungültig werden, der Rest des Besucher-Objekts bleibt unverändert.
Implementiere die Funktion revokeTicket, die ein Besucher-Objekt akzeptiert, die Ticketkennung auf null setzt und das Objekt danach zurückgibt.
const visitor = {
name: 'Verena Nardi',
age: 45,
ticketId: 'H32AZ123',
};
revokeTicket(visitor);
// => { name: 'Verena Nardi', age: 45, ticketId: null }
Um Fälschungen zu verhindern, sind die Ticketkennungen eindeutig. Sobald ein Ticket gedruckt wird, wird seine Kennung als Schlüssel in einem Objekt im System hinterlegt, damit es verfolgt werden kann.
Bevor das Ticket an einen Besucher verkauft wird, wird es mit dem Wert null im Ticketverfolgungsobjekt gespeichert.
Wenn es an einen Besucher verkauft wird, wird der Name des Besuchers als Wert zugewiesen.
Wenn Mitarbeiter Zweifel an der Gültigkeit eines Tickets haben, müssen sie den Status des Tickets im System prüfen.
Implementiere eine Funktion ticketStatus, die das Verfolgungsobjekt und eine Ticketkennung als Argumente akzeptiert.
Sie sollte eines der folgenden Ergebnisse zurückgeben.
'unknown ticket id', wenn die Kennung nicht im Verfolgungsobjekt gefunden wurde'not sold', falls das Ticket gedruckt, aber nicht verkauft wurde'sold to {name}', wobei {name} der Name des Besuchers ist, wenn das Ticket verkauft wurdeconst tickets = {
'0H2AZ123': null,
'23LA9T41': 'Verena Nardi',
};
ticketStatus(tickets, 'RE90VAW7');
// => 'unknown ticket id'
ticketStatus(tickets, '0H2AZ123');
// => 'not sold'
ticketStatus(tickets, '23LA9T41');
// => 'sold to Verena Nardi'
Nach einer Weile bekommst du Feedback von den Mitarbeitern, dass sie den Ticketstatus auf den ersten Blick leichter verstehen wollen. Sie wollen nur entweder den Namen des Besuchers sehen oder dass das Ticket ungültig ist.
Schreibe eine Funktion simpleTicketStatus, die dieselben Argumente wie ticketStatus aus Aufgabe 3 akzeptiert.
Diese Funktion gibt nur eines von zwei verschiedenen Ergebnissen zurück.
'invalid ticket !!!', wenn das Ticket noch nicht verkauft wurde oder die Kennung nicht im Verfolgungsobjekt gefunden wurdeconst tickets = {
'0H2AZ123': null,
'23LA9T41': 'Verena Nardi',
};
simpleTicketStatus(tickets, '23LA9T41');
// => 'Verena Nardi'
simpleTicketStatus(tickets, '0H2AZ123');
// => 'invalid ticket !!!'
simpleTicketStatus(tickets, 'RE90VAW7');
// => 'invalid ticket !!!'
Aufgrund neuer gesetzlicher Anforderungen enthalten neu erstellte Besucher-Objekte jetzt auch detaillierte Informationen zu den „Allgemeinen Geschäftsbedingungen“ (AGB), denen der Nutzer zugestimmt hat. Unten siehst du ein Beispiel für das neue Besucher-Objekt.
Die Kassierer des Freizeitparks müssen nun prüfen, ob ein Besucher eine neue Version der AGB unterschreiben muss.
Implementiere dazu eine Funktion gtcVersion, die ein Besucher-Objekt als Argument akzeptiert und die AGB-Version zurückgibt, falls sie verfügbar ist.
Wenn die Versionsinformationen nicht verfügbar sind, sollte nichts zurückgegeben werden.
const visitorNew = {
name: 'Verena Nardi',
age: 45,
ticketId: 'H32AZ123',
gtc: {
signed: true,
version: '2.1',
},
};
gtcVersion(visitorNew);
// => '2.1'
const visitorOld = {
name: 'Verena Nardi',
age: 45,
ticketId: 'H32AZ123',
};
gtcVersion(visitorOld);
// => undefined
Melde dich bei Exercism an, um JavaScript mit 37 Konzepte159 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.