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 {}