let obj = new WeakMap();
let sports = () => {point: 1};
obj.set(sports, "변경전");
sports = () => {point: 2};
obj.set(sports, "변경후");
let sports = () => {point: 1}; obj.set(sports, "변경전");
sports에 Function 오브젝트를 할당하고
이것을 WeakMap 인스턴스에 key로 설정
sports = () => {point: 2};
새로운 함수를 생성하여 할당
바로 위의 sports가 참조하는 메모리 주소가 바뀜
sports가 참조하는 메모리 주소가 바뀌면 앞의 sports가 참조했던 오브젝트를 호출할 수 없게 됨
이렇게 사용할 수 없게 된 {point: 1} 오브젝트는 GC 대상이 됨
엔진이 주기적으로 GC 처리를 함
obj.set(sports, "변경후");
sports를 key로 하여 WeakMap에 설정
앞에서 sports를 key로 하여 설정했으며 여기서도 sports를 key로 하여 설정하므로 값이 대체되어야 하지만
두 개의 sports가 참조하는 주소가 다르므로 sports가 추가됨
WeakMap 인스턴스의 GC 상태
// WeakMap 인스턴스의 GC 상태
let obj = new WeakMap();
let sports = () => {point: 1};
obj.set(sports, "변경전");
/*
1. 아래에서 sports 변수에 {point: 2}를 할당하므로 sports가 참조하는 오브젝트가 바뀜
*/
sports = () => {point: 2};
obj.set(sports, "변경후");
/*
1. obj의 [[Entries]]를 펼치면 0과 1이 있음
- 변수값은 바뀌어 하나이지만 WeakMap 인스턴스에는 두 개가 있음
2. {point: 1}과 {point: 2}의 메모리 주소가 다르며 sports는 사람이 보는 것으로 WeakMap은 값인 메모리 주소가 다르므로 각각 저장함
3. 그래서 sports로 저장하지 않고 인덱스를 부여하여 저장하는 것
- 엔진은 인덱스가 key이며 sports는 프로퍼티 value에서 프로퍼티 키
*/
setTimeout(function(){
console.log(obj.get(sports));
}, 2000);
/*
1. {point: 1}의 sports를 사용할 수 없으므로 GC가 {point: 1}의 sports를 메모리에서 지움. 또한 obj의 "변경전"도 삭제
2. 인덱스 1번에 0이 됨
3. Map 오브젝트에서 entry를 삭제해도 인덱스를 정리
*/
Map과 WeakMap 차이
참조하는 object를 삭제하면
Map은 그대로 갖고 있지만
WeakMap은 GC 처리로 삭제됨
Map과 WeakMap 차이
// Map과 WeakMap 차이
let mapObj = new Map();
(function(){
const obj = {key: "value"};
mapObj.set(obj, "Map");
}());
let weakObj = new WeakMap();
(function(){
const obj = {key: "value"};
weakObj.set(obj, "WeakMap");
}());
let mapObj = new Map(); (function(){...}());
즉시 실행 함수는 일회용으로 변수를 저장하지 않을 때 사용
함수가 끝나면 obj 변수를 GC가 메모리에서 지움
Map은 obj 변수가 지워지더라도 Map에 설정된 obj를 지우지 않고 유지
const weakObj = new WeakMap(); (function(){...}());