您的位置:

ES6中的Map

一、Map的基本概念

在ES6之前,JavaScript中常用的键值对数据结构是Object。Object只能用字符串作为键名,这限制了它的使用场景。Map是ES6中引入的一种新的数据结构,它可以用任意值作为键名。下面是一个简单的Map的例子:

let map = new Map();
map.set('key1', 'value1');
map.set('key2', 'value2');
console.log(map.get('key1')); //'value1'
console.log(map.size); //2

Map的基本操作包括:set()方法设置键值对、get()方法获取键对应的值、size属性获取Map中键值对的个数。Map可以包含任意类型的键和值,甚至包括NaN和undefined。

二、Map的遍历方法

Map提供了四种遍历方法:keys()、values()、entries()和forEach()。

1. keys()方法

keys()方法返回一个Iterator对象,它包含Map中所有键的列表。在遍历键之前,需要先用for-of循环或者next()方法将Iterator对象转换成数组或者遍历器对象。下面是一个keys()方法的例子:

let map = new Map();
map.set('A', 'a');
map.set('B', 'b');
let keys = map.keys();
for(let key of keys){
    console.log(key); //A B
}

2. values()方法

values()方法返回一个Iterator对象,它包含Map中所有值的列表。在遍历值之前,需要先用for-of循环或者next()方法将Iterator对象转换成数组或者遍历器对象。下面是一个values()方法的例子:

let map = new Map();
map.set('A', 'a');
map.set('B', 'b');
let values = map.values();
for(let value of values){
    console.log(value); //a b
}

3. entries()方法

entries()方法返回一个Iterator对象,它包含Map中所有键值对的列表。在遍历键和值之前,需要先用for-of循环或者next()方法将Iterator对象转换成数组或者遍历器对象。下面是一个entries()方法的例子:

let map = new Map();
map.set('A', 'a');
map.set('B', 'b');
let entries = map.entries();
for(let [key, value] of entries){
    console.log(key+':'+value); //A:a B:b
}

4. forEach()方法

forEach()方法可以遍历Map中的每一个键值对,并对其进行操作。forEach()方法接受一个函数作为参数,这个函数可以接受三个参数:键值、键名和Map本身。下面是一个forEach()方法的例子:

let map = new Map();
map.set('A', 'a');
map.set('B', 'b');
map.forEach(function(value, key, map){
    console.log(key+':'+value); //A:a B:b
});

三、Map的其他用法

1. Map的初始化

Map可以通过传入数组或者其他Map对象来进行初始化。通过传入数组,可以用数组中的分离出的键值对来初始化Map对象。下面是一个初始化Map对象的例子:

let arr = [['key1', 'value1'], ['key2', 'value2']];
let map1 = new Map(arr);
let map2 = new Map(map1);
console.log(map1.get('key1'));//value1
console.log(map2.get('key1'));//value1

2. WeakMap与Map的区别

WeakMap与Map的区别在于,WeakMap只能用对象作为键名,而且键名只能是弱引用。弱引用的意思是,当键值对中的键没有其它引用时,会被自动垃圾回收机制回收。所以,WeakMap中的键值对不会造成内存泄漏。下面是一个WeakMap的例子:

let wm = new WeakMap();
let object = {};
wm.set(object, 'value');
console.log(wm.get(object));//value
object = null;
//键已经没有引用了,所以它被垃圾回收了

四、总结

ES6中的Map是一种非常有用的数据结构,它可以用任意类型的键名和值来存储数据。Map还提供了多种遍历方法,方便我们对Map中的数据进行操作。另外,如果需要对键名具有强引用的Map,可以使用普通的Map,如果需要对键名具有弱引用的Map,可以使用WeakMap。