let john = { name: "John" };
let array = [ john ];
john = null; // 참조를 null로 덮어씀
// john을 나타내는 객체는 배열의 요소이기 때문에 가비지 컬렉터의 대상이 되지 않습니다.
// array[0]을 이용하면 해당 객체를 얻는 것도 가능합니다.
alert(JSON.stringify(array[0]));
이런 관점에서 위크맵(WeakMap)
은 일반 맵
과 전혀 다른 양상을 보입니다.
위크맵을 사용하면 키로 쓰인 객체가 가비지 컬렉션의 대상이 됩니다.
let john = { name: "John" };
let weakMap = new WeakMap();
weakMap.set(john, "...");
john = null; // 참조를 덮어씀
// john을 나타내는 객체는 이제 메모리에서 지워집니다!
WeakMap
객체는 키가 약하게 참조되는 키/값 쌍의 컬렉션으로, 키는 반드시 객체여야만 한다.
원시 값은 키가 될 수 없다. 만약 키를 원시 값으로 추가하면 Uncaught TypeError: Invalid value used as weak map key
라는 에러가 발생한다.
WeakMap
은 특정 키에 대한 값이 있는지 메서드를 통해 확인 가능하지만, 키로 보유한 객체들을 열거하는 방법은 제공되지 않는다.
keys()
, values()
, entries()
메서드를 지원하지 않는다.weakMap.get(key)
weakMap.set(key, value)
weakMap.delete(key)
weakMap.has(key)
<aside>
🚧 clear()
메서드는 보안 이슈로 인해 IE를 제외한 모든 브라우저에서 deprecated 상태.
</aside>
그리고 WeakMap
의 키로 쓰인 객체는 가비지 컬렉션 대상이 된다.
프로그램 내 객체에 대한 참조가 WeakMap
을 제외하고 존재하지 않는다면, 해당 객체는 가비지로 수거된다.
→ 가비지 컬렉션의 동작 방식 때문!
john
을 나타내는 객체처럼, 객체는 모든 참조를 잃게 되면 자동으로 가비지 컬렉션의 대상이 됩니다.