阮一峰:https://es6.ruanyifeng.com/#docs/set-map
Set
- ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
- 向 Set 加入值的时候,不会发生类型转换
- Set 实例添加了两次NaN,但是只会加入一个。这表明,在 Set 内部,两个NaN是相等的。
- Set 实例添加了两个一样的对象,它们被视为两个值
let a = NaN;
let b = NaN;
set.add(a);
set.add(b);
set // Set {NaN}
let set = new Set();
set.add({});
set.size // 1
set.add({});
set.size // 2
WeakSet
- 不重复的值的集合
- WeakSet 的成员只能是对象,而不能是其他类型的值
- WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用
- 不可遍历
const ws = new WeakSet();
ws.add(1)
// TypeError: Invalid value used in weak set
ws.add(Symbol())
// TypeError: invalid value used in weak set
const a = [[1, 2], [3, 4]];
const ws = new WeakSet(a);
// WeakSet {[1, 2], [3, 4]}
const b = [3, 4];
const ws = new WeakSet(b);
// Uncaught TypeError: Invalid value used in weak set(…)
// 数组b的成员不是对象,加入 WeakSet 就会报错
Map
- ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合
- “键”不限于字符串,各种类型的值(包括对象)都可以当作键。
- Map 也可以接受一个数组或者对象作为参数
- 对一个键连续赋值两次,后一次的值覆盖前一次的值
- 如果读取一个未知的键,则返回undefined。
- 只有对同一个对象的引用,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
const items = [
['name', '张三'],
['title', 'Author']
];
const map = new Map();
items.forEach(
([key, value]) => map.set(key, value)
);
WeakMap
- WeakMap只接受对象作为键名(null除外)。
- WeakMap的键名所引用的对象都是弱引用(WeakMap 弱引用的只是键名,而不是键值),不计入垃圾回收机制
- 没有遍历操作(即没有keys()、values()和entries()方法),也没有size属性。