WeakSet и WeakMap

Последнее обновление: 09.04.2018

WeakSet

Объект WeakSet во многом похож на обычное множество. Он также может хранить только уникальные значения, но каждый его элемент должен представлять объект.

Для создания объекта WeakSet используется его конструктор, в который можно передать начальные значения:

// пустой WeakSet
let weakSet1 = new WeakSet();
// инициализация начальными значениями
let weakSet2 = new WeakSet([{name:"Tom"}, {age: 34}]);

Для инициализации как в случае с объектом Set в конструктор передается массив, но данный массив содержит именно объекты, а не скалярные значения, типа чисел или строк.

Для добавления данных в WeakSet применяется метод add():

let weakSet = new WeakSet();
weakSet.add({lang: "JavaScript"});
weakSet.add({lang: "TypeScript"});
// weakSet.add(34);	// так нельзя - 34 - число, а не объект
console.log(weakSet);	// {{lang: "JavaScript"}, {lang: "TypeScript"}}

Причем опять же добавить мы можем только объект, а не скалярные значения типа чисел или строк.

Для удаления применяется метод delete(), в который передается ссылка на удаляемый объект:

let weakSet = new WeakSet();
var js = {lang: "JavaScript"};
var ts = {lang: "TypeScript"};
weakSet.add(js);
weakSet.add(ts);

weakSet.delete(js);

console.log(weakSet);	// {{lang: "TypeScript"}}

Если надо проверить, имеется ли объект в WeakSet, то можно использовать метод has(), который возвращает true при наличии объекта:

var js = {lang: "JavaScript"};
var ts = {lang: "TypeScript"};
var java = {lang: "Java"};
let weakSet = new WeakSet([js, ts]);
console.log(weakSet.has(ts));		// true
console.log(weakSet.has(java));		//  false

WeakMap

WeakMap представляет развитие коллекции Map. Особенностью WeakMap является то, что все ее элементы должны представлять объекты. При этом объектами должны быть как ключи, так и значения.

Создание WeakMap:

// пустой WeakMap
let weakMap1 = new WeakMap();

// WeakMap с инициализацией данными
var key1 = {key:1};
var key2 = {key:2};
var value1 = {name: "Tom"};
var value2 = {name: "Sam"};

let weakMap2 = new WeakMap([[key1, value1], [key2, value2]]);

Для получения объектов по ключу из WeakMap применяется метод get():

var key1 = {key:1};
var key2 = {key:2};
var value1 = {name: "Tom"};
var value2 = {name: "Sam"};

let weakMap2 = new WeakMap([[key1, value1], [key2, value2]]);
console.log(weakMap2.get(key1));	// {name: "Tom"}

Для добавления новых объектов или изменения старых применяется метод set():

var key1 = {key:1};
var key2 = {key:2};
var value1 = {name: "Tom"};
var value2 = {name: "Sam"};

let weakMap2 = new WeakMap([[key1, value1]]);
weakMap2.set(key2, value2);
weakMap2.set(key1, {name: "Kate"});
console.log(weakMap2.get(key1));	//{name: "Kate"}
console.log(weakMap2.get(key2));	//{name: "Sam"}

Чтобы проверить наличие элемента по определенному ключу, применяется метод has(), который возвращает true при наличии элемента:

var key1 = {key:1},
	key2 = {key:2};
var value1 = {name: "Tom"},
	value2 = {name: "Sam"};

let weakMap2 = new WeakMap([[key1, value1]]);
console.log(weakMap2.has(key1));	// true
console.log(weakMap2.has(key2));	// false

Для удаления элемента по ключу применяется метод delete():

var key1 = {key:1},
	key2 = {key:2};
var value1 = {name: "Tom"},
	value2 = {name: "Sam"};

let weakMap2 = new WeakMap([[key1, value1], [key2, value2]]);
console.log(weakMap2.has(key1));	// true
weakMap2.delete(key1);
console.log(weakMap2.has(key1));	// false
Помощь сайту
WebMoney
  • P378451176208
  • Z280152397659
ЮMoney/Яндекс-Деньги
  • 410011174743222
PayPal
  • metanit22@mail.ru
Перевод на карту
  • Номер карты: 4048415020898850