-
Set 객체Studying/JavaScript 2021. 10. 26. 20:26
ECMA Script 2015(ES6)에 추가된 Set 객체는 자료형에 관계없이 원시값과 객체 참조 모두 유일한 값을 저장하는 자료구조이다.
수학에서 다루는 집합과 동일한 개념이라고 볼 수 있다.
Set 객체는 new 연산자와 함께 Set 생성자함수를 호출하여 생성할 수 있다.
const set = new Set(); console.log(set); // Set(0) {}
생성자함수를 호출할 때 인수로 이터러블을 전달하면 해당 이터러블의 중복된 요소를 제거한 Set 객체가 생성된다.
const set = new Set([3, 4, 4, 5]); console.log(set); // Set(3) { 3, 4, 5 }
Set.prototype.add 메서드를 이용하여 Set 객체에 요소를 추가할 수 있다. 이때 중복되는 요소는 추가되지 않고, Set 객체가 현재 요소로 가지지 않는 값만 추가된다.
const set = new Set([2, 3, 4]); set.add(1); console.log(set); // Set(4) { 2, 3, 4, 1 } set.add(2); console.log(set); // Set(4) { 2, 3, 4, 1 }
Set 객체는 배열이나 객체와 같은 객체 타입을 요소로 가질 수도 있다.
const set = new Set(); set.add([1, 2]); console.log(set); // Set(1) { [ 1, 2 ] }
이때 주의해야 할 점은 원시값이 아닐 경우 Set 객체는 유일한 객체 참조 값을 저장한다는 점이다.
즉, 참조값이 다른 두 객체는 서로 다른 객체로 보고 Set에 저장된다.
const set = new Set(); set.add([1, 2]); console.log(set); // Set(1) { [ 1, 2 ] } set.add([1, 2]); console.log(set); // Set(2) { [ 1, 2 ], [ 1, 2 ] }
이와 같이 Set 객체에 추가한 두 배열 [1, 2]와 [1, 2]는 서로 다른 참조값을 가지므로 서로 다른 두 요소로서 Set 객체에 저장된 것을 알 수 있다.
그렇다면 요소를 삭제할 경우는 어떨까?
먼저 Set 객체의 원시값을 삭제하는 경우를 살펴보자.
다음과 같이 Set.prototype.delete 메서드를 이용하면 Set 객체의 특정 요소를 삭제할 수 있다.
const set = new Set([1, 2, 3]); console.log(set); // Set(3) { 1, 2, 3 } set.delete(2); console.log(set); // Set(2) { 1, 3 }
하지만 요소가 객체 타입인 경우에는 삭제하려는 객체의 참조값을 전달하지 않으면 객체를 삭제할 수 없다.
const set = new Set([ [1, 2], [1, 2] ]); console.log(set); // Set(2) { [ 1, 2 ], [ 1, 2 ] } set.delete([1, 2]); console.log(set); // Set(2) { [ 1, 2 ], [ 1, 2 ] }
지금까지 Set 객체의 요소가 각각 원시값과 객체 타입일 때 Set 객체에 요소를 추가하고 삭제하는 방법과 차이점을 살펴보았다.
Set 객체가 객체 타입의 요소를 가질 경우에는 객체의 유일한 참조값을 저장한다는 것을 기억하고 잘못 사용하는 일이 없도록 하자.
반응형'Studying > JavaScript' 카테고리의 다른 글
JS로 한글 종성 유무 판단하기 (0) 2021.11.22 Date 생성자함수, 프로토타입 객체의 프로퍼티 (0) 2021.10.19 표준 빌트인 객체 Date (0) 2021.10.12 .filter().map()과 .reduce() (0) 2021.10.04 Array.prototype.sort() 메서드 (0) 2021.10.03