MDN wants to learn about developers like you: https://qsurvey.mozilla.com/s3/MDN-dev-survey

Set 객체는 어떤 형(원시 값(primitive values)이든 객체 참조든)이든 유일한 값을 저장할 수 있습니다.

구문

new Set([iterable]);

매개변수

iterable
iterable 객체가 전달된 경우, 그 요소는 모두 새로운 Set에 추가됩니다. 만약 매개변수를 명시하지 않거나 null을 전달하면, 새로운 Set은 비어 있는 상태가 됩니다.

반환 값

새로운 Set 객체.

설명

Set 객체는 값 컬렉션으로, 삽입 순으로 그 요소를 반복(iterate)할 수 있습니다. Set 내 값은 한 번만 발생할 수 있습니다. 즉, 그 값은 Set 컬렉션 내에서 유일합니다.

값 같음

Set 내의 값은 유일해야 하기 때문에 값이 같은지를 검사를 합니다. 이전 ECMAScript 스펙에서는 이때 사용하는 알고리즘이 === 연산자와는 다른 것이 었습니다. 특히, Set에 대해서 (-0과 엄격하게(strictly) 같은) +0-0은 서로 다른 값이 었습니다. 그러나 이는 최근 ECMAScript 2015 스펙에서 변경되었습니다.  보다 자세한 사항은 브라우저 호환성 표의 "Value equality for -0 and 0" 항목을 보세요.

또한, NaNundefined도 역시 Set에 저장될 수 있습니다. 원래 NaN !== NaN이지만, Set에서 NaNNaN과 같은 것으로 간주됩니다.

속성

Set.length
length 속성값은 0.
get Set[@@species]
파생(된) 객체를 만들기 위해 사용된 생성자 함수.
Set.prototype
Set 생성자에 대한 프로토타입을 나타냅니다. 모든  Set 객체에 속성을 추가할 수 있습니다.

Set 인스턴스

모든 Set 인스턴스는 Set.prototype을 상속받습니다.

속성

Set.prototype.constructor
인스턴스의 프로토타입을 만든 함수를 반환합니다. 이는 기본으로 Set 함수입니다.
Set.prototype.size
Set 객체 내 값의 개수를 반환합니다.

메서드

Set.prototype.add(value)
Set 객체에 주어진 값을 갖는 새로운 요소를 추가합니다. Set 객체를 반환합니다.
Set.prototype.clear()
Set 객체에서 모든 요소를 제거합니다.
Set.prototype.delete(value)
value와 관련된 요소를 제거하고 Set.prototype.has(value)가 이전에 반환했던 값을 반환합니다. Set.prototype.has(value)는 그 뒤에 false를 반환합니다.
Set.prototype.entries()
삽입 순으로 Set 객체 내 각 값에 대한 [value, value] 배열을 포함하는 새로운 Iterator 객체를 반환합니다. 이는 Map 객체와 비슷하게 유지되므로 여기서 각 항목은 그 keyvalue에 대해 같은 값을 갖습니다.
Set.prototype.forEach(callbackFn[, thisArg])
삽입 순으로 Set 객체 내에 있는 각 값에 대해 한 번 callbackFn을 호출합니다. thisArg 매개변수가 forEach에 제공된 경우, 이는 각 콜백에 대해 this 값으로 사용됩니다.
Set.prototype.has(value)
Set 객체 내 주어진 값을 갖는 요소가 있는지를 주장하는(asserting, 나타내는) boolean을 반환합니다.
Set.prototype.keys()
values() 함수와 같은 함수로 삽입 순으로 Set 객체 내 각 요소에 대한 값을 포함하는 새로운 Iterator 객체를 반환합니다.
Set.prototype.values()
삽입 순으로 Set 객체 내 각 요소에 대한 을 포함하는 새로운 Iterator 객체를 반환합니다.
Set.prototype[@@iterator]()
삽입 순으로 Set 객체 내 각 요소에 대한 을 포함하는 새로운 Iterator 객체를 반환합니다.

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); // set에서 5를 제거함
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.from으로)
var myArr = Array.from(mySet); // [1, "some text", {"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]

// 교집합은 다음으로 흉내(simulate)낼 수 있음
var intersection = new Set([...set1].filter(x => set2.has(x)));

// 차집합은 다음으로 흉내낼 수 있음
var difference = new Set([...set1].filter(x => !set2.has(x)));

// forEach로 set 항목 반복
mySet.forEach(function(value) {
  console.log(value);
});

// 1
// 2
// 3
// 4

기본 집합 연산 구현

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]

Array 객체와의 관계

var myArray = ['value1', 'value2', 'value3'];

// Array를 Set으로 변환하기 위해서는 정규 Set 생성자 사용
var mySet = new Set(myArray);

mySet.has('value1'); // true 반환

// set을 Array로 변환하기 위해 전개 연산자 사용함.
console.log([...mySet]); // myArray와 정확히 같은 배열을 보여줌

스펙

스펙 상태 설명
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  

브라우저 호환성

Feature Chrome Edge Firefox (Gecko) Internet Explorer Opera Safari
Basic support

38 [1]

12 13 (13) 11 25 7.1
Constructor argument: new Set(iterable) 38 12 13 (13) No support 25 9.0
iterable 38 12 17 (17) No support 25 7.1
Set.add()returns the set 38 12 13 (13) No support 25 7.1
Set.clear() 38 12 19 (19) 11 25 7.1
Set.keys(), Set.values(), Set.entries() 38 12 24 (24) No support 25 7.1
Set.forEach() 38 12 25 (25) 11 25 7.1
Value equality for -0 and 0 38 12 29 (29) No support 25 9
Constructor argument: new Set(null) (Yes) 12 37 (37) 11 (Yes) 7.1
Monkey-patched add() in Constructor (Yes) 12 37 (37) No support (Yes) 9
Set[@@species] 51 13 41 (41) No support 38 10
Set() without new throws (Yes) 12 42 (42) 11 (Yes) 9
Feature Android Chrome for Android Edge Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support No support 38 [1] (Yes) 13.0 (13) No support No support 8
Constructor argument: new Set(iterable) No support 38 ? 13.0 (13) No support No support 9
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 9
Constructor argument: new Set(null) ? (Yes) ? 37.0 (37) ? ? 8
Monkey-patched add() in Constructor ? (Yes) ? 37.0 (37) ? ? 9
Set[@@species] ? ? ? 41.0 (41) ? ? 10
Set() without new throws ? ? ? 42.0 (42) ? ? 9

[1] 기능은 Chrome 31에서 환경 설정 뒤에 이용 가능했습니다. chrome://flags에서, “실험용 자바스크립트” 항목을 활성화하세요.

참조

문서 태그 및 공헌자

 이 페이지의 공헌자: RingoKim, loslch, dale0713, NessunKim, Netaras, vsemozhetbyt
 최종 변경: RingoKim,