Map

js对象作为映射时次要的毛病是不能应用非字符串类型作为键,Map原则上来说能够应用任意数据类型作为键
let tMap = new Map();let key1 = { x: 1 };let key2 = { y: 2 };// 赋值tMap.set(key1, 'key1');tMap.set(key2, 'key2');// 取出所有值let values = [ ...tMap.values() ];// ['key1','key2']// 在Map上应用entries()迭代let items = [ ...tMap.entries() ];// [[{x:1}, 'key1'],[{y: 2}, 'key2']]// 判断是否有指定的键tMap.has(key1); // true// size属性和clear()办法tMap.size // 2// key1 = null 后tMap仍然会存在{x:1}='key1',也就是说将key1原来的对象保留了下来,没有被GC掉key1 = nulltMap.clear()

WeakMap

WeakMap是Map的变体,二者的行为特色基本上统一,区别在于外部的内存调配工作形式。
WeakMap没有values、entries、clear办法和size属性
WeakMap的键只承受对象,而且这些对象是被弱持有的,当key1 = null后 {x:1}这部分是能够被GC回收的,并且tMap中也将key1这一项删除
let tMap = new WeakMap();let key1 = { x: 1 };tMap.set(key1, 'key1');key1 = null // tMap中不存在key1这一项

Set

Set是一组值的汇合,并且其中的值是惟一的
如果Set中增加的是对象类型数据,这个对象的接受者被赋值为null后,set中仍然会存在赋值之前的值
let s = new Set();// add 办法s.add('1');s.add(1);// size属性s.size // 2/ 取出所有值let values = [ ...s.values() ];// ['1',1]// 在Map上应用entries()迭代let items = [ ...s.entries() ];// [[1, '1'],[2, 1]]// delete 办法s.delete('1')// clear 办法s.clear()// has办法s.has(1) //truelet o = {name: 11};s.add(o);o = null; // s中仍然会存在{name: 11}这一项数据

WeakSet

WeakSet 的值必须是对象
WeakSet 没有values、entries、clear办法和size属性
let wSet = new WeakSet();let obj = {name: '里斯'};wSet.add(obj);obj = null; // wSet中删除{name: '里斯'}这一项数据