Переклад не закінчено. Будь ласка, допоможіть перекласти цю статтю з англійської.

Об'єкт Set дає можливість зберігати значення будь-якого типу, будь то примітивні значення чи посилання на об'єкт.

Синтаксис

new Set([iterable]);

Параметри

iterable
Якщо передається об'єкт, що ітерується, то всі його елементи будуть додані до нового Set. Якщо цей параметр не визначений або має значення null, тоді новий Set буде порожнім.

Значення, що повертається

Новий об'єкт Set.

Опис

Об'єкти Set  - це колекції унікальних значень. Ви можете перебирати елементи Set у порядку вставки. Одне значення в Set може зустрічатися лише один раз; воно є унікальним в колекції Set.

Еквівалентність значення

Через те, що кожне значення в Set має бути унікальним, еквівалентність значення буде перевірена. У попередній версії специфікації ECMAScript це не було базовано на такому самому алгоритмі, що використовує оператор ===. Конкретніше, для Set +0 (що є суворо рівним -0 ) та -0 є різними значеннями. Проте, це було змінено у специфікації ECMAScript 2015. Дивіться більш детально про "Еквівалентність значень -0 і 0" у таблиці браузерної сумісності.

До того ж, NaN та undefined також можуть зберігатися в SetNaN вважається тим самим, що і NaN (хоча, NaN !== NaN ).

Властивості

Set.length
Значення властивості length є 0.
get Set[@@species]
Функція-конструктор, що використовується для строрення derived об'єктів.
Set.prototype
Представляє прототип для конструктора Set. Дозволяє додавання властивостей до всіх Set об'єктів.

Set instances

Усі 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); // 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}, {"a": 1, "b": 2} 
for (let item of mySet) console.log(item);

// виводить елементи у послідовності: 1, "some text", {"a": 1, "b": 2}, {"a": 1, "b": 2} 
for (let item of mySet.keys()) console.log(item);
 
// виводить елементи у послідовності: 1, "some text", {"a": 1, "b": 2}, {"a": 1, "b": 2} 
for (let item of mySet.values()) console.log(item);

// виводить елементи у послідовності: 1, "some text", {"a": 1, "b": 2}, {"a": 1, "b": 2} 
//(key та value тут мають одне й те саме значення)
for (let [key, value] of mySet.entries()) console.log(key);

// конвертує об'єкт Set в об'єкт Array за допомогою Array.from
var myArr = Array.from(mySet); // [1, "some text", {"a": 1, "b": 2}, {"a": 1, "b": 2}]

// наступне також буде працювати, якщо буде запущено в 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([...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

Імплементація базових операцій set

Set.prototype.isSuperset = function(subset) {
    for (var elem of subset) {
        if (!this.has(elem)) {
            return false;
        }
    }
    return true;
}

Set.prototype.union = function(setB) {
    var union = new Set(this);
    for (var elem of setB) {
        union.add(elem);
    }
    return union;
}

Set.prototype.intersection = function(setB) {
    var intersection = new Set();
    for (var elem of setB) {
        if (this.has(elem)) {
            intersection.add(elem);
        }
    }
    return intersection;
}

Set.prototype.difference = function(setB) {
    var difference = new Set(this);
    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]);

setA.isSuperset(setB); // => true
setA.union(setC); // => Set [1, 2, 3, 4, 5, 6]
setA.intersection(setC); // => Set [3, 4]
setA.difference(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]); // Виведе у точності такий самий Array як і myArray

Зв'язок зі Strings

var text = 'India';

var mySet = new Set(text);  // Set {'I', 'n', 'd', 'i', 'a'}
mySet.size;  // 5

Specifications

Specification Status Comment
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Set' in that specification.
Standard Initial definition.
ECMAScript Latest Draft (ECMA-262)
The definition of 'Set' in that specification.
Draft  

Browser compatibility

FeatureChromeEdgeFirefoxInternet ExplorerOperaSafari
Basic support38121311258
new Set(iterable)381213 No259
new Set(null) Yes123711 Yes9
Set() without new throws Yes124211 Yes9
Key equality for -0 and 0381229 No259
add381213112258
clear38121911258
delete38121311258
entries381224 No258
forEach38122511258
has38121311258
prototype38121311258
size381219311258
values381224 No258
@@iterator Yes Yes

36

27 — 364 5

17 — 276 7

No Yes Yes
@@species511341 No3810
FeatureAndroid webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
Basic support38381214258 Yes
new Set(iterable)38381214259 Yes
new Set(null) Yes Yes1237 Yes9 Yes
Set() without new throws Yes Yes1242 Yes9 Yes
Key equality for -0 and 038381229259 Yes
add38381214258 Yes
clear38381219258 Yes
delete38381214258 Yes
entries38381224258 Yes
forEach38381225258 Yes
has38381214258 Yes
prototype38381214258 Yes
size383812193258 Yes
values38381224258 Yes
@@iterator Yes Yes Yes

36

27 — 364 5

17 — 276 7

Yes Yes Yes
@@species5151134138105.0

1. From version 0.10: this feature is behind the --harmony runtime flag.

2. Returns 'undefined' instead of the 'Set' object.

3. From Firefox 13 to Firefox 18, the size property was implemented as a Set.prototype.size() method, this has been changed to a property in later versions conform to the ECMAScript 2015 specification.

4. A placeholder property named @@iterator is used.

5. Supported as @@iterator.

6. A placeholder property named iterator is used.

7. Supported as iterator.

8. From version 6.0.0: this feature is behind the --harmony runtime flag.

Дівіться також

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

Мітки: 
Зробили внесок у цю сторінку: AlinaKuzmenko
Востаннє оновлена: AlinaKuzmenko,