Chociaż specyfikacja ECMAScript 6 jest jeszcze w formie roboczej, obiecuje wiele ekscytujących nowych narzędzi, które wzbogacą zestaw programisty JavaScript. Nowe klasy, takie jak Set
i Map
, oferują natywne rozwiązania do pracy z określonymi typami kolekcji, a wyrażenie for...of
stanowi elegancką alternatywę dla tradycyjnych sposobów iteracji danych.
Set
umożliwiają śledzenie kolekcji elementów, w której każdy element może się pojawić maksymalnie raz. Map
zapewniają więcej funkcji niż wcześniejsze Object
, które służyły do kojarzenia kluczy z wartościami. W przypadku Map
klucze nie muszą być ciągami znaków, a Ty nie musisz się martwić, że przypadkowo wybierzesz nazwę klucza, która koliduje z nazwami metod Object
. Operacje wyszukiwania w przypadku natywnych Map
i Set
są wykonywane w czasie stałym, co zapewnia większą wydajność niż w przypadku symulowanych implementacji.
Ten przykład pokazuje, jak utworzyć obiekt Set
i użyć do jego iteracji elementu for...of
:
<pre id="log"></pre> <script> function log() { document.querySelector('#log').textContent += Array.prototype.join.call(arguments, '') + '\n'; } log('Creating, using, and iterating over a Set:'); var randomIntegers = new Set(); // Generate a random integer in the range [1..10] five times, // and use a Set to keep track of the distinct integers that were generated. for (var i = 0; i < 5; i++) { randomIntegers.add(Math.floor(Math.random() * 10) + 1); } log(randomIntegers.size, ' distinct integers were generated.'); log('The number 10 was ', randomIntegers.has(10) ? '' : 'not ', 'one of them.'); log('Here\'s all of them:'); // Use for...of to iterate over the items in the Set. // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-iteration-statements // The Set iterator yields a single value corresponding to each entry in the Set. for (var item of randomIntegers) { log(item); } </script>
Oto odpowiadający przykład, który ilustruje użycie i przejście przez tablicę Map
:
<script> log('\nCreating and iterating over a Map:'); // Maps can be initialized by passing in an iterable value (https://people.mozilla.org/~jorendorff/es6-draft.html#sec-map-iterable) // Here, we use an Array of Arrays to initialize. The first value in each sub-Array is the new // Map entry's key, and the second is the item's value. var typesOfKeys = new Map([ ['one', 'My key is a string.'], ['1', 'My key is also a string'], [1, 'My key is a number'], [document.querySelector('#log'), 'My key is an object'] ]); // You can also call set() to add new keys/values to an existing Map. typesOfKeys.set('!!!!', 'My key is excited!'); // Use for...of to iterate over the items in the Map. // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-iteration-statements // There are several types of Map iterators available. // typesOfKeys.keys() can be used to iterate over just the keys: log('Just the keys:'); for (var key of typesOfKeys.keys()) { log(' key: ', key); } // typesOfKeys.values() can be used to iterate over just the values: log('Just the values:'); for (var value of typesOfKeys.values()) { log(' value: ', value); } // The default Map iterator yields an Array with two items; the first is the Map entry's key and the // second is the Map entry's value. This default iterator is equivalent to typesOfKeys.entries(). log('Keys and values:'); // Alternative, ES6-idiomatic syntax currently supported in Safari & Firefox: // for (var [key, value] of typesOfKeys) { … } for (var item of typesOfKeys) { log(' ', item[0], ' -> ', item[1]); } </script>
Niektóre przeglądarki, takie jak Chrome, Internet Explorer i Firefox, obsługują już Set
i Map
. Natywna obsługa uzupełniona bibliotekami polyfill, takimi jak es6-collections czy es6-shim, oznacza, że deweloperzy JavaScript mogą już teraz zacząć tworzyć kolekcje z tymi nowymi typami. W przypadku instrukcji for...of
nie ma dostępnych polyfilli (chociaż można ją przetłumaczyć za pomocą Traceur), ale obecnie obsługa natywna jest dostępna w Chrome i Firefox.
Aktualizacja z września 2014 r.: link do dodatkowej opcji polyfill, es6-shim