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

구문

new Set([iterable]);

매개변수

iterable
iterable 객체가 전달된 경우, 그 요소는 모두 새로운 Set에 추가됩니다. null은 undefined로 취급됩니다.

설명

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

값 같음

Set 내의 값은 유일해야 하기 때문에 값이 같은지를 검사하게 되는데, 이때 사용하는 알고리즘은 === 연산자와는 다릅니다. 특히, Set에 대해서 (-0과 엄격하게(strictly) 같은) +0-0은 서로 다른 값입니다. 그러나 이는 최근 ECMAScript 6 스펙에서 변경되었습니다. Gecko 29.0 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26) (bug 952870) 및 최근의 nightly Chrome을 시작으로, +0-0Set 객체에서 같은 값으로 취급됩니다. 또한, 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);
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은 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); // set에서 5를 제거함
mySet.has(5);    // false, 5가 제거되었음

mySet.size; // 3, 방금 값을 하나 제거했음

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와 value는 같음)
for (let [key, value] of mySet.entries()) console.log(key);

// set을 평범한 배열로 변환 (배열 내포(comprehension)로)
var myArr = [v for (v of mySet)]; // [1, "some text"]
// 대안 (Array.from으로)
var myArr = Array.from(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]

// 교집합은 다음으로 흉내(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

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 초기 정의.
ECMAScript 2017 Draft (ECMA-262)
The definition of 'Set' in that specification.
Draft  

브라우저 호환성

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

참조

문서 태그 및 공헌자

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