ES6 提供了新的数据结构 Map。
它有九个常用方法:
- 通过键检查元素是否存在 has(key)
- 添加元素 set(key , value)
- 通过键移除元素 delete(key)
- 通过键获取值 get(key)
- 清空Map clear()
- 遍历Map元素 forEach(fun)
- 返回一个迭代器对象 values()
- 返回一个元素是类似 [key, value] 形式的迭代器对象 entries()
- 返回一个迭代器对象。它包含按照顺序插入的每个元素的 key 值。keys()
一个常用属性:
- size 获取Map长度
Map 是一个构造函数,因此创建 Map 的方式就是通过 new 关键字创建。
语法:new Map([iterable]);
Iterable
可以是一个数组或者其他 iterable
对象,其元素为键值对(两个元素的数组,例如: [[ 1, 'one' ],[ 2, 'two' ]]
)。 每个键值对都会添加到新的 Map。null 会被当做 undefined。
var map = new Map();
map.set('name' , 'XD');
map.set('age' , 23);
console.log(map.size); //2
map.has('name'); //true
map.has('sex'); //false
map.get('name'); //XD
map.delete('name'); //true
console.log(map.size); //1
map.delete('sex'); //false
map.clear();
console.log(map.size); //0
keys() 、values() 和 entries() 都会返回一个迭代器对象,不同的是里面的元素不一样。
var map = new Map([['name', 'XD'], ['age', 23]]);
var inter1 = map.keys();
var inter2 = map.values();
var inter3 = map.entries();
console.log(inter1.next().value); //"name"
console.log(inter2.next().value); //"XD"
console.log(inter3.next().value); // ["name", "XD"]
Map 和 WeakMap
WeakMap 对象是一组键/值对的集合,其中的键是弱引用的。其键必须是对象,而值可以是任意的。
WeakMap 也是一个构造函数,因此创建 WeakMap 的方式就是通过 new 关键字创建。
语法:new WeakMap([iterable]);
Iterable 是一个数组(二元数组)或者其他可迭代的且其元素是键值对的对象。每个键值对会被加到新的 WeakMap 里。null 会被当做 undefined。
WeakMap 结构与 Map 类似,也是一组键/值对的集合。但是,它与 Map 有两个区别:
- 首先,WeakMap 的键必须是对象,而值可以是任意的。
var weakMap = new WeakMap();
weakMap.set('name' , 'XD'); //报错
var weakMap = new WeakMap();
var obj = {};
weakMap.set(obj , 'XD'); //不报错
- WeakMap 中的对象都是弱引用,即垃圾回收机制不考虑 WeakMap 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakMap 之中。
WeakMap 只有四个常用方法:
- 通过键检查元素是否存在 has(key)
- 添加元素 set(key , value)
- 通过键移除元素 delete(key)
- 通过键获取值 get(key)
var weakMap = new WeakMap();
var obj1 = {};
var obj2 = {};
weakMap.set(obj1 , 'XD');
weakMap.set(obj2 , 23);
weakMap.has(obj1); //true
weakMap.get(obj1); //XD
weakMap.delete(obj1); //true
weakMap.has(obj1); //false