乐趣区

关于javascript:ES6-Map-WeakMap-Set-WeakSet

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 = null
tMap.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) //true

let 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: '里斯'} 这一项数据
退出移动版