Array를 조금 개선한 자료구조이며 중복 없이 유일한 값을 저장할 때 사용한다. 이미 존재하는지 여부를 파악할 때 많이 사용한다.
let mySet = new Set();
mySet.add("hi");
mySet.has("hi");
mySet.delete("hi");
mySet.forEach(function(v) {
console.log(v);
});
참조를 가지고 있는 객체만 저장 가능한 set이다.
생성은 let weakSet = new WeakSet();
으로 하지만 추가, 존제 여부 확인, 삭제 등은 기본 Set과 동일하다.
차이점은 weakSet에는 숫자나 문자열과 같은 값은 넣을 수 없다. 배열과 function 같은 참조를 가지고 있는 객체만 넣을 수 있다.
let weakSet = new WeakSet();
let array = [1, 2, 3, 4];
weakSet.add(array); // true
weakSet.add(1234); // false
weakSet.add("hello"); // false
weakSet.add(null); // false
weakSet.add(function(){}); // true
weakset을 사용하는 이유는 만약 어떤 객체를 weakset에 넣은채로 객체가 null이 되거나 필요없어지면(가비지 컬렉션) 자동으로 weakset에서도 해당 객체가 존재하지 않는 것 처럼 작용한다.(값 자체는 남아있다) 이런 점을 활용하기 위해 weakset을 사용한다.
let arr = [1, 2, 3, 4];
let arr2 = [5, 6, 7, 8];
let obj = {arr, arr2};
let ws = new WeakSet();
ws.add(arr);
ws.add(arr2);
ws.add(obj);
console.log(ws); // WeakSet{{...}, Array(4), Array(4)}
// arr, arr2, obj가 모두 들어가있다.
console.log(ws.has(arr), ws.has(arr2)); // true true
arr = null; // 가비지 컬렉션 대상
console.log(ws); // WeakSet{{...}, Array(4), Array(4)}
// arr, arr2, obj가 모두 들어가있다.
console.log(ws.has(arr), ws.has(arr2)); // false true
// arr이 weakset에 들어가는 있지만, 가비지컬렉션이 된 이후에는 없는 것 처럼 작용하는 것을 볼 수 있다.
객체 형태를 중복 없이 저장하려고 할 때 유용하다.
메모리 누수에 최적화된 자료구조