This article is in need of an editorial review.
Это экспериментальная технология, часть предложения 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
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);
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 6 (ECMA-262) Определение 'Set' в этой спецификации. |
Кандидат в рекомендации | Изначальное определение. |
Совместимость с браузерами
| Возможность | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|
| Базовая поддержка |
31 [1] |
13 (13) | 11 | 25 | 7.1 |
Аргумент конструктора: new Set(iterable) |
38 | 13 (13) | Нет | 25 | Нет |
| Итерируемость | 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 | Нет |
| Возможность | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
|---|---|---|---|---|---|---|
| Базовая поддержка | Нет | 31 [1] 38 |
13.0 (13) | Нет | Нет | iOS 8 |
Аргумент конструктора: new Set(iterable) |
Нет | 38 | 13.0 (13) | Нет | Нет | Нет |
| Итерируемость | Нет | Нет | 17.0 (17) | Нет | Нет | iOS 8 |
Set.clear() |
Нет | 31 [1] 38 |
19.0 (19) | Нет | Нет | iOS 8 |
Set.keys(), Set.values(), Set.entries() |
Нет | 37 [1] 38 |
24.0 (24) | Нет | Нет | iOS 8 |
Set.forEach() |
Нет | 36 [1] 38 |
25.0 (25) | Нет | Нет | iOS 8 |
| Равенство ключей -0 and 0 | Нет | 34 [1] 38 |
29.0 (29) | Нет | Нет | Нет |
[1] Функция доступна при настройке. В chrome://flags, активируйте “Enable Experimental JavaScript”.