수색…


통사론

  • 새로운 WeakMap ([iterable]);
  • weakmap.get (key);
  • weakmap.set (key, value);
  • weakmap.has (key);
  • weakmap.delete (key);

비고

WeakMap을 사용하는 경우 ES6 WeakMap의 실제 용도는 무엇입니까?를 참조하십시오 . .

WeakMap 객체 만들기

WeakMap 객체를 사용하면 키 / 값 쌍을 저장할 수 있습니다. 맵과 의 차이점은 키가 객체이어야하고 약하게 참조되어야한다는 것입니다. 즉, 키에 대한 다른 강력한 참조가 없으면 WeakMap의 요소를 가비지 수집기에서 제거 할 수 있습니다.

WeakMap 생성자에는 두 개의 요소 배열로 키 / 값 쌍이 포함 된 반복 가능한 모든 객체 (예 : Array)가 될 수있는 선택적 매개 변수가 있습니다.

const o1 = {a: 1, b: 2},
      o2 = {};

const weakmap = new WeakMap([[o1, true], [o2, o1]]);

키와 관련된 값 가져 오기

키와 연관된 값을 얻으려면 .get() 메소드를 사용하십시오. 키에 연결된 값이 없으면 undefined 반환합니다.

const obj1 = {},
      obj2 = {};

const weakmap = new WeakMap([[obj1, 7]]);
console.log(weakmap.get(obj1)); // 7
console.log(weakmap.get(obj2)); // undefined

키에 값 할당

키에 값을 할당하려면 .set() 메소드를 사용하십시오. WeakMap 객체를 반환하므로 .set() 호출을 연결할 수 있습니다.

const obj1 = {},
      obj2 = {};

const weakmap = new WeakMap();
weakmap.set(obj1, 1).set(obj2, 2);
console.log(weakmap.get(obj1)); // 1
console.log(weakmap.get(obj2)); // 2

키가있는 요소가 있는지 검사 중입니다.

지정된 키를 가진 요소가 WeakMap에서 종료되는지 확인하려면 .has .has() 메소드를 사용하십시오. 끝내면 true 반환하고 그렇지 않으면 false 반환 true .

const obj1 = {},
      obj2 = {};

const weakmap = new WeakMap([[obj1, 7]]);
console.log(weakmap.has(obj1)); // true
console.log(weakmap.has(obj2)); // false

키를 사용하여 요소 제거하기

지정된 키가있는 요소를 제거하려면 .delete() 메서드를 사용하십시오. 요소가 존재하고 제거 되었으면 true 반환하고 그렇지 않으면 false 반환 true .

const obj1 = {},
      obj2 = {};

const weakmap = new WeakMap([[obj1, 7]]);
console.log(weakmap.delete(obj1)); // true
console.log(weakmap.has(obj1)); // false
console.log(weakmap.delete(obj2)); // false

약한 참조 데모

JavaScript는 참조 계산 기술을 사용하여 사용되지 않는 객체를 감지합니다. 개체에 대한 참조 횟수가 0이면 해당 개체는 가비지 수집기에서 해제됩니다. Weakmap은 객체의 참조 카운트에 기여하지 않는 약한 참조를 사용하므로 메모리 누수 문제 를 해결하는 데 매우 유용합니다.

다음은 weakmap 데모입니다. 약한 참조가 참조 카운트에 기여하지 않는다는 것을 나타 내기 위해 매우 큰 객체를 값으로 사용합니다.

// manually trigger garbage collection to make sure that we are in good status.
> global.gc(); 
undefined

// check initial memory use,heapUsed is 4M or so
> process.memoryUsage(); 
{ rss: 21106688,
  heapTotal: 7376896,
  heapUsed: 4153936,
  external: 9059 }

> let wm = new WeakMap();
undefined

> const b = new Object();
undefined

> global.gc();
undefined

// heapUsed is still 4M or so
> process.memoryUsage(); 
{ rss: 20537344,
  heapTotal: 9474048,
  heapUsed: 3967272,
  external: 8993 }

// add key-value tuple into WeakMap,
// key is b,value is 5*1024*1024 array 
> wm.set(b, new Array(5*1024*1024));
WeakMap {}

// manually garbage collection
> global.gc();
undefined

// heapUsed is still 45M
> process.memoryUsage(); 
{ rss: 62652416,
  heapTotal: 51437568,
  heapUsed: 45911664,
  external: 8951 }

// b reference to null
> b = null;
null

// garbage collection
> global.gc();
undefined

// after remove b reference to object,heapUsed is 4M again 
// it means the big array in WeakMap is released
// it also means weekmap does not contribute to big array's reference count, only b does.
> process.memoryUsage(); 
{ rss: 20639744,
  heapTotal: 8425472,
  heapUsed: 3979792,
  external: 8956 }


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow