이 포스팅은 javascript.info를 참고했습니다.
위크맵을 왜 사용할까요? 이를 이해하기 위해서는 가비지 컬렉션을 알아야합니다. 추후에 가비지 컬렉션에 대해서 포스팅을 해보겠습니다.
일단 여기서는 간단하게 "도달 가능한 값을 메모리에 유지한다." 라고 생각하면 됩니다.
const target = { name: 'seunghwan'};
const array = [target];
target = null;
console.log(array[0].name); // 'seunghwan'
target을 null로 덮어씀에도 불고하고 array를 통해 접근할 수 있습니다. 따라서 가비지 컬렉터의 대상이 되지 않고 남아있을 수 있는 것입니다. 맵도 마찬가지입니다.
따라서 이를 해결하기 위해 위크맵이란 자료구조가 나온것입니다. 위크맵을 사용하면 위의 문제를 해결할 수 있기 때문이죠.
위크맵은 key에 오직 객체만을 가질 수 있다는 점이 맵과 다른 점입니다.
let john = { name: "John" };
const weakMap = new WeakMap();
weakMap.set(john, '...');
john = null // john은 위크맵과 메모리에서 삭제됩니다.
또한 위크맵은 반복작업, key(), values(), entries() 메서드를 지원하지 않습니다. 가비지 컬렉션에 의해서 제거되는 타이밍을 정확히 알 수가 없기 때문입니다.
추가적인 데이터를 관리하고 싶을 때, 캐싱
위크셋도 마찬가지로 객체만 저장할 수 있다는 점에서 셋과의 차이점을 가지고 있습니다. 마찬가지로 keys(), values(), entries() 메서드, 반복작업을 할 수 없습니다.
상대적으로 위크맵보다 간단한 데이터를 저장합니다. 방문했는지 안했는지와 같은 것들이죠.
위크맵이나 위크셋이나 추가적인 자료를 저장하는데 사용됩니다. 객체가 메모리에서 삭제되면 그 와 관련된 추가적인 자료들을 메모리에서 자동으로 삭제하게끔 하는 것이죠.