가비지 컬렉션에서 배웠듯이 자바스크립트 엔진은 도달 가능한 (그리고 추후 사용될 가능성이 있는) 값을 메모리에 유지한다.
당연하게도 자료구조가 메모리에 있으면, 원소를 지우지 않는 한 계속 메모리에 남아있게 된다. 위크 맵은 이와 다르게 키값이 메모리에서 사라지게 되면 해당 엔티티가 사라지게 된다.
맵과 위크맵의 첫 번째 차이는 위크맵의 키가 반드시 객체여야 한다. 원시값은 위크맵의 키가 될 수 없다.
let weakMap = new WeakMap();
let obj = {};
weakMap.set(obj, "ok"); //정상적으로 동작합니다(객체 키).
// 문자열("test")은 키로 사용할 수 없습니다.
weakMap.set("test", "Whoops"); // Error: Invalid value used as weak map key
위크맵의 키로 사용된 객체를 참조하는 것이 아무것도 없다면 해당 객체는 메모리와 위크맵에서 자동으로 삭제된다.
let john = { name: "John" };
let weakMap = new WeakMap();
weakMap.set(john, "...");
john = null; // 참조를 덮어씀
// john을 나타내는 객체는 이제 메모리에서 지워집니다!
john을 나타내는 객체는 오로지 위크맵의 키로만 사용되고 있으므로, 참조를 덮어쓰게 되면 이 객체는 위크맵과 메모리에서 자동으로 삭제된다.
위크맵은 반복 작업과 keys(), values(), entries() 메서드를 지원하지 않는다. 이는 가비지 컬렉션이 어느 시점에 동작하는지를 알 수 없어, 관련된 작업은 할 수 없다.
위크맵은 부차적인 데이터를 저장할 곳이 필요할 때 사용 가능하다.
서드파티 라이브러리와 같은 외부 코드에 ‘속한’ 객체를 가지고 작업을 해야 한다고 가정. 이 객체에 데이터를 추가해줘야 하는데, 추가해 줄 데이터는 객체가 살아있는 동안에만 유효한 상황.
weakMap.set(john, "비밀문서");
// john이 사망하면, 비밀문서는 자동으로 파기됩니다.