// Set类似于数组,成员唯一,本身就是个构造函数
// 常用方法和属性 add has delete clear size
const set1 = new Set([1, 2, 3, 4, 4]);
console.log(set1.size);
console.log(set1.has(5));
set1.add(6);
//WeakSet也是数组,但是只能接收对象,相当于对象数组,本身也是个构造函数
//WeakSet 不能遍历,是因为成员都是弱引用,随时可能消失,遍历机制无法保证成员的存在,很可能刚刚遍历结束,成员就取不到了。
//WeakSet 的一个用处,是储存 DOM 节点,而不用担心这些节点从文档移除时,会引发内存泄漏。
const wset1 = new WeakSet();
const obj = { a: 1 }
wset1.add(obj);
console.log(wset1.has(obj));
//Map 类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键
const m = new Map();
const o = { p: 'Hello World' };
m.set(o, 'content')
m.get(o) // "content"
m.has(o) // true
m.delete(o) // true
m.has(o) // false
//作为构造函数,Map 也可以接受一个数组作为参数。该数组的成员是一个个表示键值对的数组。
const map = new Map([
['name', '张三'],
['title', 'Author']
]);
map.size // 2
map.has('name') // true
map.get('name') // "张三"
map.has('title') // true
map.get('title') // "Author"
console.log([...map]) // map转成数组
// WeakMap 只接受对象作为键名(null除外),不接受其他类型的值作为键名
// WeakMap的键名所指向的对象,不计入垃圾回收机制。
// WeakMap 弱引用的只是键名,而不是键值。键值依然是正常引用。
// 不能遍历
const wm = new WeakMap();
let key = {};
let obj1 = {foo: 1};
wm.set(key, obj1);
obj1 = null;
wm.get(key) // Object {foo: 1}
console