Our volunteers haven't translated this article into ไทย yet. Join us and help get the job done!
The Set
object lets you store unique values of any type, whether primitive values or object references.
Syntax
new Set([iterable]);
Parameters
- iterable
- If an iterable object is passed, all of its elements will be added to the new Set. null is treated as undefined.
Description
Set
objects are collections of values, you can iterate its elements in insertion order. A value in the Set
may only occur once; it is unique in the Set
's collection.
Value equality
Because each value in the Set has to be unique, the value equality will be checked and is not based on the same algorithm as the one used in the === operator. Specifically, for Set
s, +0
(which is strictly equal to -0
) and -0
are different values. However, this has been changed in the latest ECMAScript 6 specification. Starting with Gecko 29.0 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26) (bug 952870) and a recent nightly Chrome, +0
and -0
are treated as the same value in Set
objects. Also, NaN
and undefined
can also be stored in a Set. NaN
is considered the same as NaN
(even though NaN !== NaN
).
Properties
Set.size
- The value of the
size
property is 0. get Set[@@species]
- The constructor function that is used to create derived objects.
Set.prototype
- Represents the prototype for the
Set
constructor. Allows the addition of properties to allSet
objects.
Set
instances
All Set
instances inherit from Set.prototype
.
Properties
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.
Methods
Set.prototype.add(value)
- Appends a new element with the given value to the
Set
object. Returns theSet
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 thatSet.prototype.has(value)
would have previously returned.Set.prototype.has(value)
will returnfalse
afterwards. Set.prototype.entries()
- Returns a new
Iterator
object that contains an array of[value, value]
for each element in theSet
object, in insertion order. This is kept similar to theMap
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 theSet
object, in insertion order. If athisArg
parameter is provided toforEach
, it will be used as thethis
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 newIterator
object that contains the values for each element in theSet
object in insertion order. Set.prototype.values()
- Returns a new
Iterator
object that contains the values for each element in theSet
object in insertion order. Set.prototype[@@iterator]()
- Returns a new
Iterator
object that contains the values for each element in theSet
object in insertion order.
Examples
Using the Set
object
var mySet = new Set(); mySet.add(1); mySet.add(5); mySet.add("some text"); var o = {a: 1, b: 2}; mySet.add(o); mySet.has(1); // true mySet.has(3); // false, 3 has not been added to the set mySet.has(5); // true mySet.has(Math.sqrt(25)); // true mySet.has("Some Text".toLowerCase()); // true mySet.has(o); // true mySet.size; // 4 mySet.delete(5); // removes 5 from the set mySet.has(5); // false, 5 has been removed mySet.size; // 3, we just removed one value
Iterating Sets
// iterate over items in set // logs the items in the order: 1, "some text", {"a": 1, "b": 2} for (let item of mySet) console.log(item); // logs the items in the order: 1, "some text", {"a": 1, "b": 2} for (let item of mySet.keys()) console.log(item); // logs the items in the order: 1, "some text", {"a": 1, "b": 2} for (let item of mySet.values()) console.log(item); // logs the items in the order: 1, "some text", {"a": 1, "b": 2} //(key and value are the same here) for (let [key, value] of mySet.entries()) console.log(key); // convert Set object to an Array object, with Array.from var myArr = Array.from(mySet); // [1, "some text", {"a": 1, "b": 2}] // the following will also work if run in an HTML document mySet.add(document.body); mySet.has(document.querySelector("body")); // true // converting between Set and Array mySet2 = new Set([1,2,3,4]); mySet2.size; // 4 [...mySet2]; // [1,2,3,4] // intersect can be simulated via var intersection = new Set([...set1].filter(x => set2.has(x))); // difference can be simulated via var difference = new Set([...set1].filter(x => !set2.has(x))); // Iterate set entries with forEach mySet.forEach(function(value) { console.log(value); }); // 1 // 2 // 3 // 4
Implementing basic set operations
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; } //Examples 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]
Relation with Array
objects
var myArray = ["value1", "value2", "value3"]; // Use the regular Set constructor to transform an Array into a Set var mySet = new Set(myArray); mySet.has("value1"); // returns true // Use the spread operator to transform a set into an Array. console.log([...mySet]); // Will show you exactly the same Array as myArray
Specifications
Specification | Status | Comment |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Set' in that specification. |
Standard | Initial definition. |
ECMAScript 2017 Draft (ECMA-262) The definition of 'Set' in that specification. |
Draft |
Browser compatibility
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support |
38 [1] |
13 (13) | 11 | 25 | 7.1 |
Constructor argument: new Set(iterable) |
38 | 13 (13) | No support | 25 | 9.0 |
iterable | 38 | 17 (17) | No support | 25 | 7.1 |
Set.clear() |
38 | 19 (19) | 11 | 25 | 7.1 |
Set.keys(), Set.values(), Set.entries() |
38 | 24 (24) | No support | 25 | 7.1 |
Set.forEach() |
38 | 25 (25) | 11 | 25 | 7.1 |
Value equality for -0 and 0 | 38 | 29 (29) | No support | 25 | No support |
Constructor argument: new Set(null) |
(Yes) | 37 (37) | ? | ? | ? |
Monkey-patched add() in Constructor |
(Yes) | 37 (37) | ? | ? | ? |
Set[@@species] |
? | 41 (41) | ? | ? | ? |
Set() without new throws |
? | 42 (42) | ? | ? | ? |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | No support | 38 [1] | 13.0 (13) | No support | No support | 8 |
Constructor argument: new Set(iterable) |
No support | 38 | 13.0 (13) | No support | No support | No support |
iterable | No support | No support | 17.0 (17) | No support | No support | 8 |
Set.clear() |
No support | 38 | 19.0 (19) | No support | No support | 8 |
Set.keys(), Set.values(), Set.entries() |
No support | 38 | 24.0 (24) | No support | No support | 8 |
Set.forEach() |
No support | 38 | 25.0 (25) | No support | No support | 8 |
Value equality for -0 and 0 | No support | 38 | 29.0 (29) | No support | No support | No support |
Constructor argument: new Set(null) |
? | (Yes) | 37.0 (37) | ? | ? | ? |
Monkey-patched add() in Constructor |
? | (Yes) | 37.0 (37) | ? | ? | ? |
Set[@@species] |
? | ? | 41.0 (41) | ? | ? | ? |
Set() without new throws |
? | ? | 42.0 (42) | ? | ? | ? |
[1] The feature was available behind a preference from Chrome 31. In chrome://flags
, activate the entry “Enable Experimental JavaScript”.