Map
作用
ES6提供了Map数据结构。它类似于对象,也是键值对的集合。但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。Map也实现了iterator接口,
可以使用[扩展运算符…]和[for.of.]进行遍历。
特点
Map的属性和方法:
- 1、size: 返回Map的元素个数
js
let m = new Map();
console.log(m); // Map(0) {size: 0}
console.log(m.size); //0
- 2、set: 增加一个新元素,返回当前Map
js
// 添加元素
m.set('name', 'squid-Xu');
m.set('change', function () {
console.log('1111');
});
let key = {
value: 1,
};
m.set(key, [11, 22, 33]);
console.log(m); // Map(3) {'name' => 'squid-Xu', 'change' => ƒ, {…} => Array(3)}
- 3、delete: 删除元素
js
m.delete('name');
console.log(m); // Map(2) {'change' => ƒ, {…} => Array(3)}
- 4、has: 检测Map中是否包含某个元素,返回boolean值
js
console.log(m.has('name')); // false
console.log(m.has('change')); // true
- 5、clear: 清空集合,返回undefined
js
console.log(m.clear()); // undefined
console.log(m); // Map(0) {size: 0}
- 6、get:获取元素
js
console.log(m.get(key)); // [11, 22, 33]
- 7、for...of 遍历
js
let m = new Map();
// 添加元素
m.set('name', 'squid-Xu');
m.set('change', function () {
console.log('1111');
});
let key = {
value: 1,
};
m.set(key, [11, 22, 33]);
for (let v of m) {
console.log(v);
// ['name', 'squid-Xu']
// ['change', ƒ]
// [{…}, Array(3)]
}
WeakMap
WeakMap 结构与 Map 结构类似,也用于生成键值对的集合,但 WeakMap 与 Map 有两个个区别:
第一,WeakMap 只接受对象作为键名(null 除外),不接受其他类型的值作为键名。
第二,WeakMap 的键名所指向的对象不计入垃圾回收机制。它的键名所引用的对象都是弱引用,即垃圾回收机制不将该引用考虑在内,因此,只要所引用的对象的其他引用被清除了,垃圾回收机制就会释放该对象所占用的内存。也就是说, 一旦不再需要,WeakMap 里面的键名对象和所对应的键值对会自动消失,不用手动删除引用。基本上,如果要想对象中添加数据又不想干扰垃圾回收机制,便可以使用 WeakMap。一个典型的应用场景是,在网页的 DOM 元素上添加数据时就可以使用 WeakMap 结构,当该 DOM 元素被清除,其对应的 WeakMap 记录就会自动被移除。
注意
WeakMap 的专用场景就是它的键所对应的对象可能会在将来消失,WeakMap 结构有助于防止内存泄露。但是,WeakMap 弱引用的只是键名而不是键值,键值依然是正常引用的。