// Set集合与Map集合
// Set集合
// Set类型是一种无序列表,其中含有一些相互独立的非重复值
// Set集合转换为数组
/*let set = new Set([1, 4, 2, 3, 3, 3, 4, 5]), array = [...set];
console.log(array)
// 注: 将对象存储在Set的实例与存储在变量中完全一样,只要Set实例中的引用存在,垃圾回收机制就不能释放该对象中的内存空间
let set = new Set(),
key = {};
set.add(key);
console.log(set.size); // 1
// 移除原始的引用
key = null;
console.log(set.size); //1
// 重新取出原始引用
key = [...set][0];
*/
// WeakSet (弱引用Set集合)
// 只存储对象的弱引用,并且不可以存储原始值。集合中的弱引用如果是对象唯一的引用,则会被回收并释放相应内存
/*let set = new WeakSet();
set.add(12);
console.log(set.has(12)) // 报错*/
// Set 与 WeakSet 的区别
// 1. 在WeakSet 的实例中,如果向add()、has()和delete()这三个方法传入非对象参数都会导致程序报错
// 2. WeakSet 集合不可迭代,所以不能被用于for-of 循环
// 3. WeakSet 集合不暴露任何迭代器(例如keys() 和 values()方法), 所以无法通过程序本身来检测其中的内容
// 4. WeakSet 集合不支持forEach() 方法
// 5. WeakSet 集合不支持size()方法
// Map 集合
// 键名的等价性判断都是通过Object.is() 方法实现的
// map构造函数传入数组初始化一个Map集合
// let map = new Map([["name", "wujiahui"], ["age", "20"]]);
/*let map = new Map(),
key = { name: "wujiahui"}
map.set(key, "123");
map.set('name', 'wujiahui')
console.log(map.size)
map.forEach(function(value, key, ownerMap){
console.log(key + " " + value)
})
key = null;
console.log(map.size)
map.forEach(function(value, key, ownerMap){
console.log(key + " " + value)
})*/