Сводка
Объекты Set позволяют вам сохранять уникальные значения любого типа, как примитивы, так и другие типы объектов.
Синтаксис
new Set([iterable]);
Параметры
- iterable
- При передаче итерируемого объекта, все его элементы будут добавлены в новый Set. Иначе (или при
null) новыйSetбудет пуст. -
Возвращает
-
Новый
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всегда равно 0. - Чтобы узнать количество элементов в
Set, используйтеSet.prototype.size. get Set[@@species]- Функция-конструктор, которая используется для создания производных объектов.
Set.prototype- Представляет прототип конструктора
Set. Позволяет добавлять свойства всем объектам типаSet.
Экземпляры Set
Все экземпляры Set унаследованы от Set.prototype.
Свойства
Set.prototype.constructor- Returns the function that created an instance's prototype. This is the
Setfunction by default. Set.prototype.size- Returns the number of values in the
Setobject.
Методы
Set.prototype.add(value)- Appends a new element with the given value to the
Setobject. Returns theSetobject. Set.prototype.clear()- Removes all elements from the
Setobject. Set.prototype.delete(value)- Removes the element associated to the
valueand returns the value thatSet.prototype.has(value)would have previously returned.Set.prototype.has(value)will returnfalseafterwards. Set.prototype.entries()- Returns a new
Iteratorobject that contains an array of[value, value]for each element in theSetobject, in insertion order. This is kept similar to theMapobject, so that each entry has the same value for its key and value here. Set.prototype.forEach(callbackFn[, thisArg])- Calls
callbackFnonce for each value present in theSetobject, in insertion order. If athisArgparameter is provided toforEach, it will be used as thethisvalue for each callback. Set.prototype.has(value)- Returns a boolean asserting whether an element is present with the given value in the
Setobject or not. Set.prototype.keys()- Is the same function as the
values()function and returns a newIteratorobject that contains the values for each element in theSetobject in insertion order. Set.prototype.values()- Returns a new
Iteratorobject that contains the values for each element in theSetobject in insertion order. Set.prototype[@@iterator]()- Returns a new
Iteratorobject that contains the values for each element in theSetobject in insertion order.
Примеры
Использование объекта Set
var mySet = new Set();
mySet.add(1); // Set { 1 }
mySet.add(5); // Set { 1, 5 }
mySet.add(5); // Set { 1, 5 }
mySet.add("some text"); // Set { 1, 5, 'some text' }
var o = {a: 1, b: 2};
mySet.add(o);
mySet.add({a: 1, b: 2}); // переменная o связана с другим объектом, поэтому данная строка также сработает
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.has(o); // true
mySet.size; // 5
mySet.delete(5); // удаляет 5 из set
mySet.has(5); // false, 5 было удалено
mySet.size; // 4, было удалено одно значение
console.log(mySet); // Set {1, 'some text', Object {a: 1, b: 2}, Object {a: 1, b: 2}}
Обход Set
// обход элементов set
// выведет элементы по порядку: 1, "some text", {"a": 1, "b": 2}
for (let item of mySet) console.log(item);
// выведет элементы по порядку: 1, "some text", {"a": 1, "b": 2}
for (let item of mySet.keys()) console.log(item);
// выведет элементы по порядку: 1, "some text", {"a": 1, "b": 2}
for (let item of mySet.values()) console.log(item);
// выведет элементы по порядку: 1, "some text", {"a": 1, "b": 2}
//(key и value в данном случае одинаковы)
for (let [key, value] of mySet.entries()) console.log(key);
// преобразует Set в Array
var myArr = Array.from(mySet); // [1, "some text", {"a": 1, "b": 2}]
// следующее будет работать при запуске с HTML документом
mySet.add(document.body);
mySet.has(document.querySelector("body")); // true
// преобразования из Array в Set и обратно
mySet2 = new Set([1,2,3,4]);
mySet2.size; // 4
[...mySet2]; // [1,2,3,4]
// пересечение можно представить следующим образом
var intersection = new Set([...set1].filter(x => set2.has(x)));
// разность можно представить следующим образом
var difference = new Set([...set1].filter(x => !set2.has(x)));
// Обход элементов set при помощи forEach
mySet.forEach(function(value) {
console.log(value);
});
// 1
// 2
// 3
// 4
Реализация простых операций
function isSuperset(set, subset) {
for (var elem of subset) {
if (!set.has(elem)) {
return false;
}
}
return true;
}
function union(setA, setB) {
var _union = new Set(setA);
for (var elem of setB) {
_union.add(elem);
}
return _union;
}
function intersection(setA, setB) {
var _intersection = new Set();
for (var elem of setB) {
if (setA.has(elem)) {
_intersection.add(elem);
}
}
return _intersection;
}
function difference(setA, setB) {
var _difference = new Set(setA);
for (var elem of setB) {
_difference.delete(elem);
}
return _difference;
}
// Например
var setA = new Set([1, 2, 3, 4]),
setB = new Set([2, 3]),
setC = new Set([3, 4, 5, 6]);
isSuperset(setA, setB); // => true
union(setA, setC); // => Set [1, 2, 3, 4, 5, 6]
intersection(setA, setC); // => Set [3, 4]
difference(setA, setC); // => Set [1, 2]
Взаимоотношения с объектом Array
var myArray = ["value1", "value2", "value3"];
// Используйте конструктор Set для преобразования Array в Set
var mySet = new Set(myArray);
mySet.has("value1"); // вернёт true
// Используйте spread оператор для преобразования Set в Array
console.log([...mySet]); // Отобразит тот же массив, что и myArray
Взаимоотношения со String
var text = 'India';
var mySet = new Set(text); // Set ['I', 'n', 'd', 'i', 'a']
mySet.size; // 5
Спецификации
| Спецификация | Статус | Комментарий |
|---|---|---|
| ECMAScript 2015 (6th Edition, ECMA-262) Определение 'Set' в этой спецификации. |
Стандарт | Изначальное определение. |
| ECMAScript Latest Draft (ECMA-262) Определение 'Set' в этой спецификации. |
Черновик |
Совместимость с браузерами
| Компьютеры | Мобильные | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Set | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 13 | IE Полная поддержка 11 | Opera Полная поддержка 25 | Safari Полная поддержка 8 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Firefox Android Полная поддержка 14 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка 3.0 | nodejs
Полная поддержка
0.12
|
add | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 13 | IE
Частичная поддержка
11
| Opera Полная поддержка 25 | Safari Полная поддержка 8 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Firefox Android Полная поддержка 14 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка 3.0 | nodejs Полная поддержка Да |
clear | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 19 | IE Полная поддержка 11 | Opera Полная поддержка 25 | Safari Полная поддержка 8 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Firefox Android Полная поддержка 19 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка 3.0 | nodejs Полная поддержка 0.12 |
delete | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 13 | IE Полная поддержка 11 | Opera Полная поддержка 25 | Safari Полная поддержка 8 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Firefox Android Полная поддержка 14 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка 3.0 | nodejs
Полная поддержка
0.12
|
entries | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 24 | IE Нет поддержки Нет | Opera Полная поддержка 25 | Safari Полная поддержка 8 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Firefox Android Полная поддержка 24 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка 3.0 | nodejs Полная поддержка 0.12 |
forEach | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 25 | IE Полная поддержка 11 | Opera Полная поддержка 25 | Safari Полная поддержка 8 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Firefox Android Полная поддержка 25 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка 3.0 | nodejs Полная поддержка 0.12 |
has | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 13 | IE Полная поддержка 11 | Opera Полная поддержка 25 | Safari Полная поддержка 8 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Firefox Android Полная поддержка 14 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка 3.0 | nodejs Полная поддержка Да |
| Key equality for -0 and 0 | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 29 | IE Нет поддержки Нет | Opera Полная поддержка 25 | Safari Полная поддержка 9 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Firefox Android Полная поддержка 29 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 9 | Samsung Internet Android Полная поддержка 3.0 | nodejs Полная поддержка 4.0.0 |
prototype | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 13 | IE Полная поддержка 11 | Opera Полная поддержка 25 | Safari Полная поддержка 8 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Firefox Android Полная поддержка 14 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка 3.0 | nodejs Полная поддержка Да |
new Set(iterable) | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 13 | IE Нет поддержки Нет | Opera Полная поддержка 25 | Safari Полная поддержка 9 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Firefox Android Полная поддержка 14 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 9 | Samsung Internet Android Полная поддержка 3.0 | nodejs Полная поддержка 0.12 |
new Set(null) | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 37 | IE Полная поддержка 11 | Opera Полная поддержка 25 | Safari Полная поддержка 9 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Firefox Android Полная поддержка 37 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 9 | Samsung Internet Android Полная поддержка 3.0 | nodejs
Полная поддержка
0.12
|
Set() without new throws | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 42 | IE Полная поддержка 11 | Opera Полная поддержка 25 | Safari Полная поддержка 9 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Firefox Android Полная поддержка 42 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 9 | Samsung Internet Android Полная поддержка 3.0 | nodejs Полная поддержка 0.12 |
size | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox
Полная поддержка
19
| IE Полная поддержка 11 | Opera Полная поддержка 25 | Safari Полная поддержка 8 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Firefox Android
Полная поддержка
19
| Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка 3.0 | nodejs Полная поддержка 0.12 |
values | Chrome Полная поддержка 38 | Edge Полная поддержка 12 | Firefox Полная поддержка 24 | IE Нет поддержки Нет | Opera Полная поддержка 25 | Safari Полная поддержка 8 | WebView Android Полная поддержка 38 | Chrome Android Полная поддержка 38 | Firefox Android Полная поддержка 24 | Opera Android Полная поддержка 25 | Safari iOS Полная поддержка 8 | Samsung Internet Android Полная поддержка 3.0 | nodejs Полная поддержка 0.12 |
@@iterator | Chrome Полная поддержка 43 | Edge Полная поддержка 12 | Firefox
Полная поддержка
36
| IE Нет поддержки Нет | Opera Полная поддержка 30 | Safari Полная поддержка Да | WebView Android Полная поддержка 43 | Chrome Android Полная поддержка 43 | Firefox Android
Полная поддержка
36
| Opera Android Полная поддержка 30 | Safari iOS Полная поддержка Да | Samsung Internet Android Полная поддержка 4.0 | nodejs Полная поддержка 0.12 |
@@species | Chrome Полная поддержка 51 | Edge Полная поддержка 13 | Firefox Полная поддержка 41 | IE Нет поддержки Нет | Opera Полная поддержка 38 | Safari Полная поддержка 10 | WebView Android Полная поддержка 51 | Chrome Android Полная поддержка 51 | Firefox Android Полная поддержка 41 | Opera Android Полная поддержка 41 | Safari iOS Полная поддержка 10 | Samsung Internet Android Полная поддержка 5.0 | nodejs
Полная поддержка
6.5.0
|
Легенда
- Полная поддержка
- Полная поддержка
- Частичная поддержка
- Частичная поддержка
- Нет поддержки
- Нет поддержки
- Смотрите замечания реализации.
- Смотрите замечания реализации.
- Пользователь должен сам включить эту возможность.
- Пользователь должен сам включить эту возможность.
- Использует нестандартное имя.
- Использует нестандартное имя.