WeakSet
WeakSet은 Set과 유사합니다만, Set과 달리 객체만 수집할 수 있고 약한 참조가 이루어져 메모리 누수를 예방할 수 있습니다.
영상 강의
PART 1
예제
Set과 달리 WeakSet은 다음의 차이점을 가집니다.
size
속성을 가지지 않습니다.- 객체 타입만
.add()
하거나,.delete()
할 수 있습니다. forEach
,for..in
문을 사용해 순환할 수 없습니다.- 약한 참조로 메모리 누수 관리에 효과적입니다.
// 데이터(객체)
let arr = [1, 3, 5, 7],
obj = {key: 'value'};
// Set 객체 생성
let set = new Set();
// WeakSet 객체 생성
let wset = new WeakSet();
// 아이템 추가
set.add(arr).add(obj);
wset.add(arr).add(obj);
// 아이템 사이즈
console.log(set.size); // 2
console.log(wset.size); // undefined
// 객체가 아닌 데이터 추가
set.add(true);
wset.add(true); // 오류 발생: Invalid value used in weak set
// 아이템 소유 여부 확인
set.has(obj); // true
wset.has(obj); // true
// 아이템 제거
set.delete(arr); // true
wset.delete(arr); // true
// 세트 순환
set.forEach(item => console.log(item)); // 참조된 데이터에 접근 및 사용 가능
wset.forEach(item => console.log(item)); // 오류 발생: wset.forEach is not a function
// 메모리 참조
let set = new Set();
let wset = new WeakSet();
(() => {
let o1 = {a: 1}; // 메모리
let o2 = {a: 2}; // 가비지 컬렉터에 의해 메모리 삭제
set.add(o1);
wset.add(o2);
});
WeakSet 어떻게 사용하면 좋을까?
// WeakSet 객체 생성
let ownClass = new WeakSet();
// 클래스 OffCanvasMenu 정의
class OffCanvasMenu {
constructor() {
// 클래스 자신을 ownClass에 추가
ownClass.add(this);
// ...
}
toggle() {
// OffCanvasMenu 객체가 아닌,
// 다른 객체가 toggle() 메서드를 사용하려 할 경우 오류 출력
if ( !ownClass.has(this) ) {
throw new TypeError('toggle() 메서드는 OffCanvasMenu 객체만 사용 가능합니다!');
}
}
}