一、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。