由于Set集合没有键名,不适合处理键值对的数据结构,所以ES6又添加了Map集合来解决这个问题。
Map集合内含多组键值对,每个元素分别存放可访问的键名和对应的值。
- 注意点:与对象不同的是,Map集合的键名不需要都是字符串形式,也不会被强制转化为字符串形式,如以下代码,5和‘5’两个键值对是不冲突的
let map = new Map();
map.set(5,'zjf');
map.set('5','lll');
console.log(map); //{5 => "zjf", "5" => "lll"}
Map集合的方法
- set(): 添加新元素或者修改元素,传入两个参数,键名和对应值 map.set('5','zjf');
- get(): 获取相应键名对应的值 ,传入键名,如果不存在,就会返回undefined map.get('5'); //'zjf'
- has(): 检测键名在Map集合中是否存在 map.has('5'); //true
- delete() : 移除指定的键名和其对应值 map.delete('5');
- clear() : 移除Map集合中的所有键值对
- forEach(): 回调函数会传入三个参数:值,键名,Map集合本身
map.forEach(function(value, key, ownerSet) {
console.log(key + ':' + value);
console.log(ownerSet === set); //true
})
可以向Map构造函数传入数组来初始化一个Map集合,每个元素是一个子数组(包括键名和键值两个元素)
let map = new Map([['name','zjf'],['age',22]]);
console.log(map.get('name')); //"zjf"
console.log(map.get('age')); //22
WeakMap
与Set和WeakSet的关系相同,WeakMap同样是弱引用, 就是只有该对象对其引用了,而没有别的对其引用(就不会被标记),就会被垃圾回收机制回收,解决内存泄漏的问题。
键名必须是非null类型的对象,键值可以是任何类型的值。
let map = new WeakMap(),
key = {};
map.set(key, 'zjf');
map.get(key); // "zjf"
console.log(map.get(key));
key = null;
console.log(map.get(key)); //undefined
WeakMap的方法
只支持has()和delete()方法,不支持键名枚举,也不支持clear()方法