--- title: Set slug: Web/JavaScript/Reference/Global_Objects/Set tags: - ECMAScript6 - JavaScript - set - Экспериментальный translation_of: Web/JavaScript/Reference/Global_Objects/Set ---
Объекты Set
позволяют вам сохранять уникальные значения любого типа, как {{Glossary("Primitive", "примитивы")}}, так и другие типы объектов.
new Set([iterable]);
null
) новый Set
будет пуст.Новый Set
объект.
Объекты Set
представляют коллекции значений, по которым вы можете выполнить обход в порядке вставки элементов. Значение элемента в Set
может присутствовать только в одном экземпляре, что обеспечивает его уникальность в коллекции Set
.
Поскольку каждое значение в Set
должно быть уникальным, сравнение значений основано на алгоритме "подобное значение": NaN
равно NaN
(несмотря на то, что NaN !== NaN
); все другие значения рассматриваются равными исходя из семантики оператора строго равенства ===. В ранних версиях черновика ECMAScript 6 -0
и +0
считались разными (несмотря на то, что -0 === +0
), это было изменено в последующих версиях и адаптировано в Gecko 29 {{geckoRelease("29")}} ({{bug("952870")}}) и последней ночной сборке Chrome. NaN
и undefined
также могут сохраняться в Set
.
Set.length
length
всегда равно 0.Set
, используйте {{jsxref("Set.prototype.size")}}.Set
. Позволяет добавлять свойства всем объектам типа Set
.Set
Все экземпляры Set
унаследованы от {{jsxref("Set.prototype")}}.
{{page('ru/Web/JavaScript/Reference/Global_Objects/Set/prototype','Properties')}}
{{page('ru/Web/JavaScript/Reference/Global_Objects/Set/prototype','Methods')}}
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 // выведет элементы по порядку: 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
Спецификация | Статус | Комментарий |
---|---|---|
{{SpecName('ES6', '#sec-set-objects', 'Set')}} | {{Spec2('ES6')}} | Изначальное определение. |
{{SpecName('ESDraft', '#sec-set-objects', 'Set')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.builtins.Set")}}