[JS]WeakMap和WeakSet

WeakMap 
WeakMap 和 Map 的第一个不同点就是,WeakMap 的键必须是对象,不能是原始值。
 
如果我们在 weakMap 中使用一个对象作为键,并且没有其他对这个对象的引用 — 该对象将会被从内存(和map)中自动清除。
1 let john = { name: "John" };
2 
3 let weakMap = new WeakMap();
4 weakMap.set(john, "...");
5 
6 john = null; // 覆盖引用
7 // john 被从内存删除了
WeakMap 不支持迭代以及 keys(),values() 和 entries() 方法。所以没有办法获取 WeakMap 的所有键或值。

      WeakMap 只有以下的方法:

      weakMap.get(key)
      weakMap.set(key, value)
      weakMap.delete(key)
      weakMap.has(key)
 
 
例如,我们有用于处理用户访问计数的代码。收集到的信息被存储在 map 中:一个用户对象作为键,其访问次数为值。当一个用户离开时(该用户对象将被垃圾回收机制回收),这时我们就不再需要他的访问次数了。
1 // visitsCount.js
2 let visitsCountMap = new WeakMap(); // weakmap: user => visits count
3 
4 // 递增用户来访次数
5 function countUser(user) {
6    let count = visitsCountMap.get(user) || 0;
7    visitsCountMap.set(user, count + 1);
8 }

WeakSet

WeakSet 的表现类似:

 
      与 Set 类似,但是我们只能向 WeakSet 添加对象(而不能是原始值)。
      对象只有在其它某个(些)地方能被访问的时候,才能留在 set 中。
      跟 Set 一样,WeakSet 支持 add,has 和 delete 方法,但不支持 size 和 keys(),并且不可迭代。
 
1 let jack = {name: "jack"};
2 let weakSet = new WeakSet();
3 weakSet.add(jack, 22);
4 console.log( weakSet.has(jack) ); // true
5 weakSet.delete(jack);
6 console.log( weakSet );  // WeakSet {}



猜你喜欢

转载自www.cnblogs.com/feng-fengfeng/p/12401078.html