Maps und Sets
Unter jedem Gast liegt in einer Map genau ein Getränk. Die Extras sammelt ein Set, und jedes Extra darf nur einmal vorkommen. Bei lida steht anfangs tea; danach liegt dort mint. Ins Set kommen mint und lemon. Die Seite zeigt die Zeile lida / mint / 2.
Die Strict-Mode-Seite war etwas anderes
Dort ist ReferenceError geflogen, ein Name fehlte. Hier fliegt nichts. Ein Schlüssel, den es nicht gibt, liefert über get den Wert undefined.
Gleicher Schlüssel, anderes Getränk
Zuerst legt orders.set("lida", "tea") das Getränk ab. orders.set("lida", "mint") hängt keine zweite Zeile an: der Wert dieses Schlüssels wird überschrieben. Gezählt werden von size die Schlüssel, nicht die Aufrufe von set.
const orders = new Map();
orders.set("lida", "tea");
orders.set("lida", "mint");
console.log(orders.get("lida"));
console.log(orders.size);
In der Konsole steht zuerst mint, dann 1. Für nima wurde nie etwas abgelegt, also ist orders.get("nima") gleich undefined. orders.has("lida") ist true. Gelesen wird eine Map mit get. Die Schreibweisen orders.lida und orders["lida"] gehören zu gewöhnlichen Objekten und lesen diese Map nicht.
Ein Objekt als Schlüssel bleibt dieses Objekt
Eine Map darf ein Objekt als Schlüssel nehmen. Festgehalten wird das Objekt selbst, nicht ein Text aus seinen Feldern. Ein weiteres Objekt mit denselben Feldern ist ein anderer Schlüssel.
const cup = { guest: "lida" };
const other = { guest: "lida" };
const orders = new Map();
orders.set(cup, "tea");
console.log(orders.get(cup));
console.log(orders.get(other));
console.log(orders.size);
Die Konsole zeigt tea, danach undefined, danach 1. Ein gewöhnliches Objekt würde beide Schlüssel zur Zeichenkette "[object Object]" machen, und der zweite Schreibvorgang würde den ersten ersetzen. Die Map tut das nicht.
Die zweite mint fällt weg
Zweimal add("mint") lässt nur eine mint stehen. lemon ist ein weiterer Wert, deshalb steht size auf 2. Mit has kommt ja oder nein zurück, nicht der Wert selbst.
const extras = new Set();
extras.add("mint");
extras.add("mint");
extras.add("lemon");
console.log(extras.size);
console.log(extras.has("lemon"));
Die Konsole zeigt 2, dann true. Dieselbe Menge entsteht mit new Set(["mint", "mint", "lemon"]): die zweite mint ist schon weg. Ein Set kennt nur Werte. Ein Getränk unter einem Gast legt es nicht ab.
delete nimmt genau diesen Eintrag
War etwas zu entfernen, gibt delete den Wert true zurück. Fehlt der Wert, kommt false, und das Set bleibt, wie es war.
const extras = new Set(["mint", "lemon"]);
console.log(extras.delete("lemon"));
console.log(extras.size);
console.log(extras.has("lemon"));
Die Konsole zeigt true, dann 1, dann false. mint liegt noch drin. Auch eine Map hat delete und has, dort zählt der Schlüssel: orders.delete("lida") nimmt diesen Gast heraus.
Was die Seite hinschreibt
Das Getränk von lida wird ersetzt, das Set entsteht aus drei Wörtern, und hingeschrieben werden Gast, Getränk und size.
<!DOCTYPE html>
<html>
<body>
<p id="line">…</p>
<script>
const orders = new Map();
orders.set("lida", "tea");
orders.set("lida", "mint");
const extras = new Set(["mint", "mint", "lemon"]);
const line = document.querySelector("#line");
line.textContent = "lida / " + orders.get("lida") + " / " + extras.size;
</script>
</body>
</html>
Zu lesen ist lida / mint / 2. Das erste set auf tea erscheint nicht mehr. Die wiederholte mint hebt size nicht an. ReferenceError war die Zeile der Strict-Mode-Seite.
Kurz an der Theke
- lida zuerst auf tea, dann auf mint setzen. get("lida") ist mint, size bleibt 1.
- tea unter cup ablegen. get(other) ist undefined, size bleibt 1.
- mint, noch einmal mint, dann lemon hinzufügen. size ist 2, has("lemon") ist true.
- lemon entfernen. size ist 1, has("lemon") ist false.
- Die Seite lesen. Die Zeile ist lida / mint / 2.
Leicht daneben, und was bleibt
Ein zweites set auf demselben Schlüssel aktualisiert. Ein zweites add desselben Extras wird übergangen.
- Die Map nicht mit orders["lida"] lesen
- Zwei ähnlich aussehende Objekte sind nicht ein Schlüssel
- has gibt das Getränk nicht zurück
- new Set streicht Kopien schon beim Anlegen
- Die Zeile nicht als ReferenceError lesen
Daran festhalten
- set ersetzt, und size bleibt
- Objektschlüssel sind die Objekte selbst
- Ein Set behält jeden Wert einmal
- delete entfernt einen Eintrag
- Die Zeile der Seite ist lida / mint / 2
🧠 Testen Sie Ihr Wissen
Testen Sie Ihr Wissen
Fordern Sie sich mit diesem interaktiven Quiz heraus und sehen Sie, wie gut Sie das Thema verstehen
📝 Anweisungen
- Lesen Sie jede Frage sorgfältig
- Wählen Sie die beste Antwort für jede Frage
- Sie können das Quiz so oft wiederholen, wie Sie möchten
- Ihr Fortschritt wird oben angezeigt