Введение
Перед ES6 JavaScript не имел собственной реализации наборов. Что такое набор? Набор – это список значений, которые не могут содержать дубликатов. Давайте рассмотрим, какие проблемы решают Native ES6, и как мы можем их использовать.
Конструктор
Чтобы создать новый набор, мы можем использовать новый набор () Анкет Вы также можете дать итератор непосредственно в конструкторе.
const set = new Set()
console.log(set) // Set {}
const set = new Set([1, 2, 3])
console.log(set) // Set { 1, 2, 3 }
Если вы дадите итерабильно с дубликатами, набор будет игнорировать дубликаты после первого:
const set = new Set([1, 2, 2, 2, 3, 4, 5, 5, 5, 4])
// Set { 1, 2, 3, 4, 5 }
Свойство Method Add и размер
Наборы имеют Добавить Метод, который позволяет добавить один элемент в набор. Наборы также имеют размер свойство, чтобы получить количество элементов в наборе.
const set = new Set() set.size // 0 set.add(2) set.size // 1
Добавить игнорируется, если набор уже имеет значение:
const set = new Set(['Hello', 'World'])
set.add('Hello')
console.log(set) // Set { 'Hello', 'World' }
Проблемы решены от обходных путей
Перед наборами вам придется использовать обычные объекты для моделирования набора. Поскольку только строки могут быть использованы в качестве ключей, могут возникнуть некоторые проблемы. 5 будет принужден к «5», {} будет «[объект объекта]». Наборы не принуждают значения. 5 и «5» – два разных значения.
const set = new Set()
set.add({})
set.add({})
set.size // 2
console.log(set) // Set { {}, {} }
set.add(5)
set.add('5')
set.add(5) // this will be ignored
set.size // 4
console.log(set) // Set { {}, {}, 5, '5' }
Следовательно, несколько объектов могут быть добавлены в набор. Устанавливает использование Object.is () Чтобы сравнить два значения:
Object.is(5, 5) //true
Object.is(5, '5') //false
Object.is({},{}) //false
Есть, удалять и четкие методы
- есть (значение) Проверяет, если значение находится в наборе. Возвращает истинно или ложь
- Удалить (значение) удаляет значение из набора
- clear () удаляет все значения из набора
const set = new Set() set.add(5) set.has(5) // true set.has(8) // false const set = new Set([1, 2, 3]) set.size // 3 set.delete(2) set.size // 2 set.clear() set.size // 0
Итерация
Для итерации через набор вы можете использовать метод Foreach (). Существует небольшая разница, когда вы используете его на объекте/массиве. foreach () принимает три аргумента:
- Значение
- ключ (индекс)
- массив или объект, который вы итерации
Тем не менее, в наборе первые два аргумента одинаковы. Это потому, что у подборов нет ключей. Так:
const set = new Set([1, 2, 3])
set.forEach((value, key, s) => {
console.log(`${value} ${key}`)
console.log( set === s)
})
//1 1
//true
//2 2
//true
//3 3
//true
Таким образом, вы можете использовать тот же метод, который вы уже использовали для массивов и объектов.
Set => Множество
Мы уже видели, что вы можете преобразовать массив в набор, передавая массив в установленный конструктор. Вы также можете преобразовать набор в массив, используя оператор спреда:
const set = new Set([1, 2, 3]) const array = [...set] console.log(array) // [ 1, 2, 3 ]
Слабые наборы
Эти наборы можно назвать сильный Устанавливает, потому что он содержит ссылки на объекты. Это работает так, как будто вы храните объект внутри переменной. Пока существует экземпляры SET, объект не может быть составлен за мусором, чтобы освободить память.
const set = new Set()
let obj = {}
set.add(obj)
set.size // 1
obj = null
set.size // 1
// We can retrieve the original reference
obj = [...set][0]
console.log(obj) // {}
В некоторых случаях вам нужны ссылки в наборе, чтобы исчезнуть, если все остальные ссылки исчезнут. ES6 включает в себя слабые наборы. Слабые наборы могут хранить только слабые ссылки на объекты. Таким образом, если нет других ссылок на объект, ссылка внутри набора исчезнет. Слабые набор также не могут содержать примитивные значения (без строк или целых чисел)
const set = new WeakSet()
let obj = {}
set.add(5) // ERROR
let obj = {}
set.add(obj)
set.has(obj) // true
obj = null // remove the reference to obj, also removes it in set
set.has(obj) // false
Слабые сведения:
- Будет бросить ошибки, если вы передадите необъекты в add () , Имеет () или delete () Анкет
- не являются итерами. Вы не можете использовать метод или метод foreach ().
- не иметь свойства размера.
Ограниченный Функциональность слабых наборов необходима для правильной обработки памяти.
Вывод
ES6 дает вам новый способ создания наборов и решает множество проблем ES5 с использованными разработчиками обходных путей. Используйте слабые наборы, если вам нужно только отслеживать ссылки на объекты и предотвратить утечки памяти.
Оригинал: “https://dev.to/damcosset/sets-in-javascript-es6-3fdh”