Neue Sprachfeatures im ECMAScript-6-Entwurf – Teil 1

Seite 4: Generatoren und neue Objektmengen

Inhaltsverzeichnis

Die Generatoren stattet ECMAScript 6 mit weiteren Optionen zur Realisierung von Iteratoren aus, wobei das Hauptaugenmerk auf dem verzögerten Erstellen der Daten lieht. Bei den Generatoren unterscheidet man zwischen der "Generator Comprehension" und den Generatoren, die mit dem Schlüsselwort yield implementiert werden.

Folgender Quelltextauszug zeigt eine einfache Form der Generator Comprehensions. In ihm wird eine Liste generator erstellt, die das Programm erst durch die for-Schleife mit dem zusätzlichen Schüsselwort of ausführt. Die Besonderheit dabei ist, dass der Generator erst zum Zeitpunkt der for-Schleife ausgeführt wird und nicht bereits bei der Zuweisung an die Variable generator.

let list = [1, 2, 3];

let generator = (for (x of list) x);

for (let item of generator) {
console.log(item);
}

Das Verwenden des Schlüsselworts yield erlaubt die Rückgabe von Funktionswerten analog zum return-Statement mit dem Unterschied, dass die Funktion nach jedem Aufruf des yield-Statements eingefroren wird und der interne Zustand bis zum nächsten Aufruf erhalte bleibt. Man kennzeichnet diese Art von Funktionen mit einem * nach dem Schlüsselwort function:

function* generator() {
yield 1;
yield 2;
yield 3;
}

for (let item of generator()) {
console.log(item);
}

JavaScript erhält in seiner nächsten Version drei neue Arten von Objektmengen. Zum Speichern von Schlüssel-Wert-Paaren gibt die Klasse Map.

var m = new Map();

m.set("key1", "val1");
m.set("key2", "val2");
m.set("key3", "val3");

m.forEach(function(item, key) {
console.log(key + ": " + item);
});

console.log("key2?: " + m.has("key2"));

console.log("Wert von key2: " + m.get("key2"));

console.log("Lösche key2: " + m.delete("key2"))

console.log("key2?: " + m.has("key2"));

Die Umsetzung des Mengentyps WeakMap, der ebenfalls für ECMAScript 6 vorgesehen ist, verhält sich analog zu ihr mit der Ausnahme, dass der Garbage Collector die Objekte aus dem Speicher entfernen kann. Aus dem Grund ist eine Umsetzung erst mit der Unterstützung aus der JavaScript-VM möglich und lässt sich nicht mit bestehenden JavaScript-Implementierungen simulieren. Hinzu kommt eine ergänzende Klasse Set, die dem Speichern von Elementen analog zu einem Array dient. Zur Erhöhung der Performanz speichert sie die Einträge aber nicht in einer festen Reihenfolge.

var s = new Set();

s.add('a');
s.add({hello: 'world'});

console.log("a?: " + s.has('a'));

s.forEach(function(item) {
console.log("item: " + JSON.stringify(item));
});