ES6: Set, Map, WeakSet и WeakMap
Set
Set — коллекция значений в любом формате, представленных в одном единственном экземпляре.
let set = new Set();
set.add("js");
set.add("node js");
set.add("java");
set.add("js");
set.add("node js");
// set сохраняет только уникальные значения
alert( set.size ); // 3
set.forEach( str => alert(str) ); // js, node js, java
Методы:
Set.prototype.add(value)
— добавляет значение в setSet.prototype.clear()
— удаляет все элементы с setSet.prototype.delete(value)
— удаляет элемент с определенным значениемSet.prototype.has(value)
— возвращает true если элемент с таким значением есть в set и false если нетSet.prototype.entries()
— возвращает new Iterator который включает в себя массив значенийSet.prototype.forEach(callbackFn[, thisArg])
— вызывает callback функцию для каждого элемента в порядке добавления элементов в setSet.prototype.values()
— возвращает new Iterator который включает в себя значенияSet.prototype.keys()
— работает аналогично Set.prototype.values()Set.prototype[@@iterator]()
— возвращает new Iterator который включает в себя массив значений в порядке добавления
Рассмотрим методы, которые не представлены в первом примере.
Demo: Set.prototype.delete()
const set1 = new Set();
set1.add(100).add(20);
set1.delete(100);
console.log(set1.size);
// expected output: 1
Demo: Set.prototype.entries()
const set1 = new Set();
set1.add(42);
set1.add('forty two');
const iterator1 = set1.entries();
for (let entry of iterator1) {
console.log(entry);
// expected output: [42, 42]
// expected output: ["forty two", "forty two"]
}
Demo: Set.prototype.forEach()
function logSetElements(value1, value2, set) {
console.log('s[' + value1 + '] = ' + value2);
}
new Set(['foo', 'bar', undefined]).forEach(logSetElements);
// expected output: "s[foo] = foo"
// expected output: "s[bar] = bar"
// expected output: "s[undefined] = undefined"
Demo: Set.prototype.values
const set1 = new Set();
set1.add(42);
set1.add('forty two');
var iterator1 = set1.values();
console.log(iterator1.next().value);
// expected output: 42
console.log(iterator1.next().value);
// expected output: "forty two"
Demo: Set.prototype[@@iterator]()
const set1 = new Set();
set1.add(42);
set1.add('forty two');
const iterator1 = set1[Symbol.iterator]();
console.log(iterator1.next().value);
// expected output: 42
console.log(iterator1.next().value);
// expected output: "forty two"
Обход Set
for (let item of mySet) console.log(item);
for (let item of mySet.keys()) console.log(item);
for (let item of mySet.values()) console.log(item); // key и value в данном случае одинаковы
Map
Map — коллекция для хранения данных в виде ключ : значение, но, в отличии от обычных ассоциативных массивов, ключем может быть любой тип (как примитивы так и объекты).
let map = new Map();
map.set('str1', 'Hello world'); // ключ-строка
map.set(1, 20.17); // число
map.set(true, 'we can & get data'); // булевое значение
console.log( map.get('str1') ); // 'Hello world'
console.log( map.get(1) ); // 20.17
console.log( map.get(true) ); // 'we can & get data'
console.log( map.size ); // 3
Методы:
Map.prototype.set(key, value)
— добавляет значениеMap.prototype.get(key)
— считывает значение по ключуMap.prototype.size
— кол-во элементов в MapMap.prototype.clear()
— удалит все пары ключи/значения в mapMap.prototype.delete(key)
— удалит определенную пару ключ/значение, поиск по ключу. Вернет true если этот ключ будет найден и удален и false — если ключ не будет найден в mapMap.prototype.entries()
— возвращает new Iterator который включает в себя массив [ключ, значение]Map.prototype.forEach(callback())
— вызывает callback функцию для каждой пары в mapMap.prototype.keys()
— возвращает new Iterator который включает в себя ключиMap.prototype.values()
— возвращает new Iterator который включает в себя значенияMap.prototype[@@iterator]()
— возвращает new Iterator который включает в себя массив [ключ, значение]
Некоторые методы мы рассмотрели выше в примере, некоторые довольно простые, но есть и те, в которых без примера не разобраться. Остановим свое внимание на методах, которые используют new Iterator.
Demo: Map.prototype.entries()
var map1 = new Map();
map1.set('0', 'foo');
map1.set(1, 'bar');
var iterator1 = map1.entries();
console.log(iterator1.next().value);
// expected output: ["0", "foo"]
console.log(iterator1.next().value);
// expected output: [1, "bar"]
Demo: Map.prototype.forEach()
function logMapElements(value, key, map) {
console.log(`m[${key}] = ${value}`);
}
new Map([['foo', 3], ['bar', {}], ['baz', undefined]])
.forEach(logMapElements);
// expected output: "m[foo] = 3"
// expected output: "m[bar] = [object Object]"
// expected output: "m[baz] = undefined"
Demo: Map.prototype.keys()
var map1 = new Map();
map1.set('0', 'foo');
map1.set(1, 'bar');
var iterator1 = map1.keys();
console.log(iterator1.next().value);
// expected output: "0"
console.log(iterator1.next().value);
// expected output: 1
Demo: Map.prototype[@@iterator]()
var map1 = new Map();
map1.set('0', 'foo');
map1.set(1, 'bar');
var iterator1 = map1[Symbol.iterator]();
for (let item of iterator1) {
console.log(item);
// expected output: Array ["0", "foo"]
// expected output: Array [1, "bar"]
}
Обход Map
for (var [key, value] of myMap) {
alert(key + " = " + value);
}
for (var key of myMap.keys()) {
alert(key);
}
for (var value of myMap.values()) {
alert(value);
}
for (var [key, value] of myMap.entries()) {
alert(key + " = " + value);
}
myMap.forEach(function(value, key, myMap) {
alert(key + " = " + value);
})
WeakSet
WeakSet — коллекция значений, формат которых могут быть только объекты, представленные в одном единственном экземпляре.
Ссылки на объекты в WeakSet являются слабыми: если на объект, хранимый в WeakSet нет ни одной внешней ссылки, то сборщик мусора удалит этот объект. Также это означает, что WeakSet не итерируем, так как нет возможности получить список текущих хранимых в WeakSet объектов.
const weakset1 = new WeakSet();
const object1 = {'a': 'b'};
weakset1.add(object1);
console.log(weakset1.has(object1)); // true
weakset1.delete(object1)
console.log(weakset1.has(object1)); // false
Методы:
WeakSet.prototype.add(value)
— добавляет обьект в WeakSetWeakSet.prototype.delete(value)
— удаляет из WeakSet элементWeakSet.prototype.has(value)
— возвращает true если элемент с таким значением есть в WeakSet и false если нет
WeakMap
WeakMap — коллекция пар ключ-значение, где в качестве ключей могут быть использованы только объекты, а значения могут быть произвольных типов.
const weakmap1 = new WeakMap();
const object1 = {};
const object2 = {'a': 'b'};
weakmap1.set(object1, 'foo');
weakmap1.set(object2, 'foo2');
console.log(weakmap1.get(object1));
//expected output: "foo"
console.log(weakmap1.has(object2));
//expected output: true
Методы:
WeakMap.prototype.set(key, value)
— добавляет значение в WeakMapWeakMap.prototype.get(key)
— возвращает значение из WeakMap по keyWeakMap.prototype.delete(key)
— удаляет из WeakMap элемент по keyWeakMap.prototype.has(key)
— возвращает true если элемент с таким ключем есть в WeakMap и false если нет