ES6 新增了如下集合对象
- Map
- WeakMap
- Set
- WeakSet
其中 Map
和 WeakMap
是一组,Set
和 WeakSet
是一组,从代码层面来讲,Weakxxx
无法被迭代且只能以 Object 或继承自 Object 的对象作为值,因为它们保存的是对象的弱引用。
Map & WeakMap
Map
主要方法和特点:
- get
- set
- has
- delete
- values
- keys
- clear
- entries
- size (属性)
- 内置迭代器,可以通过
for ... of
遍历。 - key 和 value 可以为任何 JS 值
- 初始化时可以传入一个可迭代对象作为初始值(
e.g.: [[1, 2], [3, 4]]
)
WeakMap
主要方法和特点:
- 没有 clear、entries 方法
- 无法被迭代
- key 只能为对象呢类型
- 对象的弱引用不影响垃圾回收机制
Set & WeakSet
Set
主要方法和特点:
- has
- size (属性)
- delete
- add
- clear
- 内部使用 === 判断元素是否相等,所以两个内容相同的对象字面量是不同的
- key 可以是任何 JS 值
- 内置迭代器,可以被
for of
遍历
WeakSet
主要方法和特点:
- 没有 clear 方法和 size 属性
- key 只能为对象类型
- 不可被迭代
代码示例
const m = new Map([
[1, 2],
[3, 4],
[5, 6]
])
m.get(1) // 2
m.has(4) // false
m.size // 3
m.values() // [2, 4, 6]
m.keys() // [1, 3, 5]
for(const [k, v] of m) {
console.log(k, v)
}
const o1 = {1: 2}, o2 = {2: 3}, o3 = {3: 4}
const wm = new WeakMap([
[o1, 'val1'],
[o2, 'val2'],
[o3, 'val3'],
// [4, 5] key 非 Object 实例,报错
])
wm.has(o1) // true
o2[2] = 114514
wm.has(o2) // true 改变 key 的值的引用并不影响 map
const s = new Set([1, 2, 3, 1])
const ws = new Set([o1, o2, o3])