Movatterモバイル変換


[0]ホーム

URL:


  1. Web
  2. JavaScript
  3. JavaScript-Leitfaden
  4. Schlüsselbasierte Sammlungen

Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.

View in EnglishAlways switch to English

Schlüsselbasierte Sammlungen

Dieses Kapitel führt Sammlungen von Daten ein, die über einen Schlüssel indiziert sind;Map- undSet-Objekte enthalten Elemente, die in der Reihenfolge des Einfügens iterierbar sind.

Maps

Map-Objekt

EinMap-Objekt ist eine Schlüssel/Wert-Abbildung, die ihre Elemente in Einfügereihenfolge iterieren kann.

Der folgende Code zeigt einige grundlegende Operationen mit einerMap. Siehe auch dieMap-Referenzseite für weitere Beispiele und die vollständige API. Sie können einefor...of-Schleife verwenden, um ein Array von[key, value] für jede Iteration zurückzugeben.

js
const sayings = new Map();sayings.set("dog", "woof");sayings.set("cat", "meow");sayings.set("elephant", "toot");sayings.size; // 3sayings.get("dog"); // woofsayings.get("fox"); // undefinedsayings.has("bird"); // falsesayings.delete("dog");sayings.has("dog"); // falsefor (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 wurdenObjekte 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.

  • Die Schlüssel einesObject sindStrings oderSymbole, während sie bei einerMap von jedem Wert sein können.
  • Sie können dieGröße einerMap leicht ermitteln, während Sie bei einemObject die Größe manuell verfolgen müssen.
  • Die Iteration von Maps erfolgt in der Einfügereihenfolge der Elemente.
  • EinObject hat ein Prototyp, daher gibt es Standard-Schlüssel in der Map. (Dies kann umgangen werden, indemmap = Object.create(null) verwendet wird.)

Diese drei Tipps können Ihnen helfen zu entscheiden, ob Sie eineMap oder einObject verwenden sollten:

  • Verwenden Sie Maps anstelle von Objekten, wenn Schlüssel zur Laufzeit unbekannt sind und alle Schlüssel sowie alle Werte denselben Typ haben.
  • Verwenden Sie Maps, wenn primitive Werte als Schlüssel gespeichert werden müssen, da ein Objekt jeden Schlüssel als Zeichenfolge behandelt, unabhängig davon, ob es sich um einen Zahlenwert, einen booleschen Wert oder einen anderen primitiven Wert handelt.
  • Verwenden Sie Objekte, wenn es eine Logik gibt, die auf einzelne Elemente wirkt.

WeakMap-Objekt

EinWeakMap ist eine Sammlung von Schlüssel/Wert-Paaren, deren Schlüssel Objekte odernicht registrierte Symbole sein müssen, mit beliebigen Werten desJavaScript-Typs, und das keine starken Referenzen zu seinen Schlüsseln erstellt. Das heißt, die Anwesenheit eines Objekts als Schlüssel in einerWeakMap 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 jederWeakMap ebenfalls zur Speicherungskandidaten, solange sie nicht anderswo stark referenziert werden. Der einzige primitive Typ, der alsWeakMap-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.

DieWeakMap-API ist im Wesentlichen die gleiche wie dieMap-API. EineWeakMap 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 einerWeakMap 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 derWeakMap-Referenzseite.

Ein Anwendungsfall fürWeakMap-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 imprivates-Objekt gespeichert, das eineWeakMap ist. Alles, was auf der Instanz und dem Prototyp exponiert ist, ist öffentlich; alles andere ist von der Außenwelt unzugänglich, daprivates nicht aus dem Modul exportiert wird.

js
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 mitKlassen und privaten Feldern umgesetzt werden.

Sets

Set-Objekt

Set-Objekte sind Sammlungen einzigartiger Werte. Sie können ihre Elemente in Einfügereihenfolge iterieren. Ein Wert in einemSet darf nur einmal vorkommen; er ist einzigartig in der Sammlung desSet.

Der folgende Code zeigt einige grundlegende Operationen mit einemSet. Siehe auch dieSet-Referenzseite für weitere Beispiele und die vollständige API.

js
const mySet = new Set();mySet.add(1);mySet.add("some text");mySet.add("foo");mySet.has(1); // truemySet.delete("foo");mySet.size; // 2for (const item of mySet) {  console.log(item);}// 1// "some text"

Umwandlung zwischen Array und Set

Sie können einArray aus einem Set mithilfe vonArray.from oder derSpread-Syntax erstellen. Auch derSet-Konstruktor akzeptiert einArray, um in die andere Richtung umgewandelt zu werden.

Hinweis:Set-Objekte speicherneinzigartige Werte—daher werden alle doppelten Elemente aus einem Array beim Konvertieren gelöscht!

js
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. DasSet-Objekt hat jedoch einige Vorteile:

  • Das Löschen von Array-Elementen nach Wert (arr.splice(arr.indexOf(val), 1)) ist sehr langsam.
  • MitSet-Objekten können Sie Elemente anhand ihres Wertes löschen. Bei einem Array müssten Sie basierend auf dem Index eines Elementssplice verwenden.
  • Der WertNaN kann in einem Array nicht mitindexOf gefunden werden.
  • Set-Objekte speichern einzigartige Werte. Sie müssen keine Doppelgänger manuell nachverfolgen.

WeakSet-Objekt

WeakSet-Objekte sind Sammlungen von speicherbereinigbaren Werten, einschließlich Objekten undnicht registrierten Symbolen. Ein Wert imWeakSet darf nur einmal vorkommen. Er ist einzigartig in der Sammlung desWeakSet.

Die Hauptunterschiede zumSet-Objekt sind:

  • Im Gegensatz zuSets sindWeakSetsSammlungen vonObjekten oder Symbolen nur, und nicht von beliebigen Werten beliebiger Typen.
  • DasWeakSet istschwach: Referenzen zu Objekten in der Sammlung werden schwach gehalten. Wenn es keine andere Referenz zu einem imWeakSet 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 vonWeakSet-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.

Schlüssel- und Wertgleichheit von Map und Set

Sowohl die Schlüsselgleichheit vonMap-Objekten als auch die Wertgleichheit vonSet-Objekten basieren auf demSameValueZero-Algorithmus:

  • Die Gleichheit funktioniert wie der Identitätsvergleichsoperator===.
  • -0 und+0 werden als gleich betrachtet.
  • NaN wird sich selbst als gleich betrachtet (im Gegensatz zu===).

Help improve MDN

Learn how to contribute Diese Seite wurde automatisch aus dem Englischen übersetzt.

[8]ページ先頭

©2009-2025 Movatter.jp