Dieses Kapitel führt Sammlungen von Daten ein, die über einen Schlüssel indiziert sind; Map
- und Set
-Objekte enthalten Elemente, die in der Reihenfolge des Einfügens iterierbar sind.
Ein Map
-Objekt ist eine Schlüssel/Wert-Abbildung, die ihre Elemente in Einfügereihenfolge iterieren kann.
Der folgende Code zeigt einige grundlegende Operationen mit einer Map
. Siehe auch die Map
-Referenzseite für weitere Beispiele und die vollständige API. Sie können eine for...of
-Schleife verwenden, um ein Array von [key, value]
für jede Iteration zurückzugeben.
const sayings = new Map();
sayings.set("dog", "woof");
sayings.set("cat", "meow");
sayings.set("elephant", "toot");
sayings.size; // 3
sayings.get("dog"); // woof
sayings.get("fox"); // undefined
sayings.has("bird"); // false
sayings.delete("dog");
sayings.has("dog"); // false
for (const [key, value] of sayings) {
console.log(`${key} goes ${value}`);
}
// "cat goes meow"
// "elephant goes toot"
sayings.clear();
sayings.size; // 0
Vergleich von Object und Map
Traditionell wurden Objekte verwendet, um Zeichenfolgen mit Werten zu verknüpfen. Objekte ermöglichen es, Schlüssel zu Werten zu setzen, diese Werte abzurufen, Schlüssel zu löschen und zu erkennen, ob etwas unter einem Schlüssel gespeichert ist. Map
-Objekte haben jedoch einige Vorteile, die sie zu besseren Karten machen.
Object
sind Strings oder Symbole, während sie bei einer Map
von jedem Wert sein können.GröÃe
einer Map
leicht ermitteln, während Sie bei einem Object
die GröÃe manuell verfolgen müssen.Object
hat ein Prototyp, daher gibt es Standard-Schlüssel in der Map. (Dies kann umgangen werden, indem map = Object.create(null)
verwendet wird.)Diese drei Tipps können Ihnen helfen zu entscheiden, ob Sie eine Map
oder ein Object
verwenden sollten:
Ein WeakMap
ist eine Sammlung von Schlüssel/Wert-Paaren, deren Schlüssel Objekte oder nicht registrierte Symbole sein müssen, mit beliebigen Werten des JavaScript-Typs, und das keine starken Referenzen zu seinen Schlüsseln erstellt. Das heiÃt, die Anwesenheit eines Objekts als Schlüssel in einer WeakMap
verhindert nicht, dass das Objekt von der Speicherbereinigung erfasst wird. Sobald ein Objekt, das als Schlüssel verwendet wird, gesammelt wurde, werden seine entsprechenden Werte in jeder WeakMap
ebenfalls zur Speicherungskandidaten, solange sie nicht anderswo stark referenziert werden. Der einzige primitive Typ, der als WeakMap
-Schlüssel verwendet werden kann, ist das Symbol â genauer gesagt, nicht registrierte Symbole â, da nicht registrierte Symbole garantiert einzigartig sind und nicht wiederhergestellt werden können.
Die WeakMap
-API ist im Wesentlichen die gleiche wie die Map
-API. Eine WeakMap
erlaubt jedoch nicht das Beobachten der Lebendigkeit ihrer Schlüssel, weshalb sie keine Aufzählung zulässt. Es gibt also keine Methode, um eine Liste der Schlüssel in einer WeakMap
zu erhalten. Wenn es eine gäbe, würde die Liste vom Zustand der Speicherbereinigung abhängen und Nicht-Determinismus einführen.
Weitere Informationen und Beispielcode finden Sie unter "Why WeakMap?" auf der WeakMap
-Referenzseite.
Ein Anwendungsfall für WeakMap
-Objekte ist das Speichern privater Daten für ein Objekt oder das Verstecken von Implementierungsdetails. Im folgenden Beispiel gehören die privaten Daten und Methoden innerhalb des Objekts und sind im privates
-Objekt gespeichert, das eine WeakMap
ist. Alles, was auf der Instanz und dem Prototyp exponiert ist, ist öffentlich; alles andere ist von der AuÃenwelt unzugänglich, da privates
nicht aus dem Modul exportiert wird.
const privates = new WeakMap();
export default function Public() {
const me = {
// Private data goes here
};
privates.set(this, me);
}
Public.prototype.method = function () {
const me = privates.get(this);
// Do stuff with private data in `me`
// â¦
};
Hinweis: Dieser Anwendungsfall kann inzwischen mit Klassen und privaten Feldern umgesetzt werden.
Sets Set-ObjektSet
-Objekte sind Sammlungen einzigartiger Werte. Sie können ihre Elemente in Einfügereihenfolge iterieren. Ein Wert in einem Set
darf nur einmal vorkommen; er ist einzigartig in der Sammlung des Set
.
Der folgende Code zeigt einige grundlegende Operationen mit einem Set
. Siehe auch die Set
-Referenzseite für weitere Beispiele und die vollständige API.
const mySet = new Set();
mySet.add(1);
mySet.add("some text");
mySet.add("foo");
mySet.has(1); // true
mySet.delete("foo");
mySet.size; // 2
for (const item of mySet) {
console.log(item);
}
// 1
// "some text"
Umwandlung zwischen Array und Set
Sie können ein Array
aus einem Set mithilfe von Array.from
oder der Spread-Syntax erstellen. Auch der Set
-Konstruktor akzeptiert ein Array
, um in die andere Richtung umgewandelt zu werden.
Hinweis: Set
-Objekte speichern einzigartige Werteâdaher werden alle doppelten Elemente aus einem Array beim Konvertieren gelöscht!
Array.from(mySet);
[...mySet2];
mySet2 = new Set([1, 2, 3, 4]);
Vergleich von Array und Set
Traditionell wurden in JavaScript in vielen Situationen Mengenelemente in Arrays gespeichert. Das Set
-Objekt hat jedoch einige Vorteile:
arr.splice(arr.indexOf(val), 1)
) ist sehr langsam.Set
-Objekten können Sie Elemente anhand ihres Wertes löschen. Bei einem Array müssten Sie basierend auf dem Index eines Elements splice
verwenden.NaN
kann in einem Array nicht mit indexOf
gefunden werden.Set
-Objekte speichern einzigartige Werte. Sie müssen keine Doppelgänger manuell nachverfolgen.WeakSet
-Objekte sind Sammlungen von speicherbereinigbaren Werten, einschlieÃlich Objekten und nicht registrierten Symbolen. Ein Wert im WeakSet
darf nur einmal vorkommen. Er ist einzigartig in der Sammlung des WeakSet
.
Die Hauptunterschiede zum Set
-Objekt sind:
Sets
sind WeakSets
Sammlungen von Objekten oder Symbolen nur, und nicht von beliebigen Werten beliebiger Typen.WeakSet
ist schwach: Referenzen zu Objekten in der Sammlung werden schwach gehalten. Wenn es keine andere Referenz zu einem im WeakSet
gespeicherten Objekt gibt, können sie gesammelt werden. Das bedeutet auch, dass es keine Liste der aktuellen Objekte in der Sammlung gibt.WeakSets
sind nicht aufzählbar.Die Anwendungszwecke von WeakSet
-Objekten sind begrenzt. Sie werden keinen Speicherverlust verursachen, daher kann es sicher sein, DOM-Elemente als Schlüssel zu verwenden und sie zu Ãberwachungszwecken zu markieren.
Sowohl die Schlüsselgleichheit von Map
-Objekten als auch die Wertgleichheit von Set
-Objekten basieren auf dem SameValueZero-Algorithmus:
===
.-0
und +0
werden als gleich betrachtet.NaN
wird sich selbst als gleich betrachtet (im Gegensatz zu ===
).RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4