Set

Эта статья нуждается в редакционном обзоре. Как вы можете помочь.

Это экспериментальная технология, часть предложения Harmony (ECMAScript 6).
Поскольку спецификация этой технологии ещё не стабилизировалась, проверьте таблицу совместимости её использования в различных браузерах. Также обратите внимание, что синтаксис и поведение экспериментальной технологии могут быть изменены в будущих версиях браузеров в соответствии с изменениями в спецификации.

Сводка

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

Синтаксис

 new Set([iterable]);

Параметры

iterable
При передаче итерируемого объекта, все его элементы будут добавлены в новый Set.

Описание

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

Сравнение значений

Поскольку каждое значение в Set должно быть уникальным, сравнение значений основано на алгоритме "подобное значение": NaN равно NaN (несмотря на то, что NaN !== NaN); все другие значения рассматриваются равными исходя из семантики оператора строго равенства ===. В ранних версиях черновика ECMAScript 6 -0 и +0 считались разными (несмотря на то, что -0 === +0), это было изменено в последующих версиях и адаптировано в Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26) (баг 952870) и последней ночной сборке Chrome.  NaN и undefined также могут сохраняться в Set.

 

Свойства

Set.length
Значение свойства length всегда равно 1.
Set.prototype
Представляет прототип конструктора Set. Позволяет добавлять свойства всем объектам типа Set.

Экземпляры Set

Все экземпляры Set унаследованы от Set.prototype.

Свойства

Set.prototype.constructor
Returns the function that created an instance's prototype. This is the Set function by default.
Set.prototype.size
Returns the number of values in the Set object.

Методы

Set.prototype.add(value)
Appends a new element with the given value to the Set object. Returns the Set object.
Set.prototype.clear()
Removes all elements from the Set object.
Set.prototype.delete(value)
Removes the element associated to the value and returns the value that Set.prototype.has(value) would have previously returned. Set.prototype.has(value) will return false afterwards.
Set.prototype.entries()
Returns a new Iterator object that contains an array of [value, value] for each element in the Set object, in insertion order. This is kept similar to the Map object, so that each entry has the same value for its key and value here.
Set.prototype.forEach(callbackFn[, thisArg])
Calls callbackFn once for each value present in the Set object, in insertion order. If a thisArg parameter is provided to forEach, it will be used as the this value for each callback.
Set.prototype.has(value)
Returns a boolean asserting whether an element is present with the given value in the Set object or not.
Set.prototype.keys()
Is the same function as the values() function and returns a new Iterator object that contains the values for each element in the Set object in insertion order.
Set.prototype.values()
Returns a new Iterator object that contains the values for each element in the Set object in insertion order.
Set.prototype[@@iterator]()
Returns a new Iterator object that contains the values for each element in the Set object in insertion order.

Примеры

Использование объекта Set

var mySet = new Set();

mySet.add(1);
mySet.add(5);
mySet.add("some text");

mySet.has(1); // true
mySet.has(3); // false, 3 не добавлено в set
mySet.has(5);              // true
mySet.has(Math.sqrt(25));  // true
mySet.has("Some Text".toLowerCase()); // true

mySet.size; // 3

mySet.delete(5); // удаляет 5 из set
mySet.has(5);    // false, 5 было удалено

mySet.size; // 2, было удалено одно значение

Обход Set

// обход элементов set
// выведет элементы в виде: 1, "some text" 
for (let item of mySet) console.log(item);

// выведет элементы в виде: 1, "some text" 
for (let item of mySet.keys()) console.log(item);
 
// выведет элементы в виде: 1, "some text"
for (let item of mySet.values()) console.log(item);

// выведет элементы в виде: 1, "some text"
//(key and value are the same here)
for (let [key, value] of mySet.entries()) console.log(key);

// преобразует set в Array
var myArr = [v for (v of mySet)]; // [1, "some text"]

// следующее будет работать при запуске с HTML документом
mySet.add(document.body);
mySet.has(document.querySelector("body")); // true

// преобразования из Set в Array и обратно
mySet2 = new Set([1,2,3,4]);
mySet2.size; // 4
[...mySet2]; // [1,2,3,4]

// пересечение можно представить следующим образом  
var intersection = new Set([x for (x of set1) if (set2.has(x))]);

// Обход элементов set при помощи forEach
mySet.forEach(function(value) {
  console.log(value);
});

// 1
// 2
// 3
// 4

Взаимоотношения с объектом Array

var myArray = ["value1", "value2", "value3"];

// Используйте конструктор Set для преобразования Array в Set
var mySet = new Set(myArray);

mySet.has("value1"); // вернёт true

// Используйте переменный оператор для преобразования Set в Array
alert(uneval([...mySet])); // Отобразит тот же массив, что и myArray

Спецификации

Спецификация Статус Комментарий
ECMAScript 2015 (6th Edition, ECMA-262)
Определение 'Set' в этой спецификации.
Стандарт Изначальное определение.
ECMAScript 2017 Draft (ECMA-262)
Определение 'Set' в этой спецификации.
Черновик  

Совместимость с браузерами

Возможность Chrome Firefox (Gecko) Internet Explorer Opera Safari
Базовая поддержка

31 [1]
38

13 (13) 11 25 7.1
Аргумент конструктора: new Set(iterable) 38 13 (13) Нет 25 9.0
Итерируемость 38 17 (17) Нет 25 7.1
Set.clear() 31 [1]
38
19 (19) 11 25 7.1

Set.keys(),

Set.values(),

Set.entries()

37 [1]
38
24 (24) Нет 25 7.1
Set.forEach() 36 [1]
38
25 (25) 11 25 7.1
Равенство ключей -0 и 0 34 [1]
38
29 (29) Нет 25 Нет
Constructor argument: new Set(null) (Да) 37 (37) ? ? ?
Monkey-patched add() in Constructor (Да) (Да) ? ? ?
Set[@@species] ? 41 (41) ? ? ?
Set() без new throws ? 42 (42) ? ? ?
Возможность Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Базовая поддержка Нет 31 [1]
38
13.0 (13) Нет Нет 8
Аргумент конструктора: new Set(iterable) Нет 38 13.0 (13) Нет Нет Нет
Итерируемость Нет Нет 17.0 (17) Нет Нет 8
Set.clear() Нет 31 [1]
38
19.0 (19) Нет Нет 8
Set.keys(), Set.values(), Set.entries() Нет 37 [1]
38
24.0 (24) Нет Нет 8
Set.forEach() Нет 36 [1]
38
25.0 (25) Нет Нет 8
Равенство ключей -0 and 0 Нет 34 [1]
38
29.0 (29) Нет Нет Нет
Constructor argument: new Set(null) ? (Да) 37.0 (37) ? ? ?
Monkey-patched add() in Constructor ? (Да) 37.0 (37) ? ? ?
Set[@@species] ? ? 41.0 (41) ? ? ?
Set() без new throws ? ? 42.0 (42) ? ? ?

[1] Функция доступна при настройке. В chrome://flags, активируйте “Enable Experimental JavaScript”.

Смотрите также

Метки документа и участники

 Внесли вклад в эту страницу: vibecode, ViZhe, dtretyakov
 Обновлялась последний раз: vibecode,