11. Map 和 WeakMap

ES6 中两种新的数据结构集:MapWeakMap。事实上每个对象都可以看作是一个 Map

一个对象由多个 key-val 对构成,在 Map 中,任何类型都可以作为对象的 key,如:

  1. var myMap = new Map();
  2. var keyString = "a string",
  3. keyObj = {},
  4. keyFunc = function () {};
  5. // 设置值
  6. myMap.set(keyString, "value 与 'a string' 关联");
  7. myMap.set(keyObj, "value 与 keyObj 关联");
  8. myMap.set(keyFunc, "value 与 keyFunc 关联");
  9. myMap.size; // 3
  10. // 获取值
  11. myMap.get(keyString); // "value 与 'a string' 关联"
  12. myMap.get(keyObj); // "value 与 keyObj 关联"
  13. myMap.get(keyFunc); // "value 与 keyFunc 关联"

WeakMap

WeakMap 就是一个 Map,只不过它的所有 key 都是弱引用,意思就是 WeakMap 中的东西垃圾回收时不考虑,使用它不用担心内存泄漏问题。

另一个需要注意的点是,WeakMap 的所有 key 必须是对象。它只有四个方法 delete(key),has(key),get(key)set(key, val)

  1. let w = new WeakMap();
  2. w.set('a', 'b');
  3. // Uncaught TypeError: Invalid value used as weak map key
  4. var o1 = {},
  5. o2 = function(){},
  6. o3 = window;
  7. w.set(o1, 37);
  8. w.set(o2, "azerty");
  9. w.set(o3, undefined);
  10. w.get(o3); // undefined, because that is the set value
  11. w.has(o1); // true
  12. w.delete(o1);
  13. w.has(o1); // false