ECMAScript 6 中的Map集合类型

 2015年11月23日    121     声明


Map对象是一种简单的键/值映射,其中的键和值可以是任意值(原始值或对象的值),Map对象是ECMAScript 6(ECMAScript 2015)中新增的数据类型。


1. Map类型

new Map([iterable])
  • iterable - 可选参数,一个可迭代对象,是一个包含 键-值 对的数组,数组中所有的键-值对集合对会被添加到新的Map集合中。

迭代Map对象中的元素时,for…of循环会返回每一个迭代对象的[key, value]数组。

ObjectMap

ObjectMap的相似之处在于,它们都是按键存取一个值,而且键都是可以删除的。可以看出,二者之间是非常相似的,它的不同这之处在于:

  • 对象通常都有自己的原型,也就是说一个对象总有一个"prototype"键。不过现在你可以使用,map = Object.create(null)来创建一个没有原型的对象。
  • 一个对象的键只能是StringSymbol,而Map的键可以是任意值
  • Map的键值对个数很容易获取,而获取一个Object键值对个数确相对复杂。

ECMAScript 6之前,一般可以认为我们是将对象当做Map来使用的:

var map = {};

//如果不存在这个键,则为这个键赋值
if (!map['name']) {
    map['name'] = 'itbilu.com';

现在我们可以这样使用Map:

//定义Map
var map = new Map();

//存储数据
map.set("name", "itbilu.com");

//获取数据
var name = map.get("name");


2. Map对象实例属性

2.1 构造器属性:Map.prototype.constructor

构造器属性,默认是Map()函数。


2.2 成员数属性:Map.prototype.size

返回Map()对象的成员数,即:键/值对的数量。


3. Map对象实例方法

3.1 请空集合:Map.prototype.clear()

Map.prototype.clear()

清空Map对象中所有的键/值对。


3.2 请空集合:Map.prototype.delete()

Map.prototype.delete(key)

移除集合中键值为key的元素,返回值是一个Boolean,表示移除结果。


3.3 返回key/value迭代器:Map.prototype.entries()

Map.prototype.entries()

返回一个包含Map对象中每一个[key, value]数组的Iterator迭代器。


3.4 添加元素处理函数:Map.prototype.forEach()

Map.prototype.forEach(callback[, thisArg])

forEach方法会对Map对象中的每个元素执行提供的callback函数一次。提供thisArg参数后执行callback函数时候,thisArg可以当作this值来使用

myMap.forEach(function(value, key) {
  console.log(key + " = " + value);
}, myMap)
// 0 = zero
// 1 = one


3.5 获取值:Map.prototype.get()

Map.prototype.get(key)

返回Map对象中键值为key的元素的值。


3.6 检查有指定的元素:Map.prototype.has()

Map.prototype.has(key)

判断Map对象中是否有键为key的元素,返回一个Boolean值。


3.7 返回所有key的迭代器:Map.prototype.keys()

Map.prototype.keys()

返回一个包含Map对象中每一个keyIterator迭代器。


3.8 设置新值:Map.prototype.set(key, value)

Map.prototype.set(key, value)

Map对象设置新的key-value,返回新的Map对象。

var map = new Map();
map.set('name', 'itbilu.com');
console.log(map.get('name'));  //itbilu.com


3.9 返回所有value的迭代器:Map.prototype.values()

Map.prototype.values()

返回一个包含Map对象中每一个valueIterator迭代器。


4. Map的使用

Map对象的使用

var myMap = new Map();

var keyString = "a string",
    keyObj = {},
    keyFunc = function () {};

// 设置各种类型的key
myMap.set(keyString, "String类型key的值");
myMap.set(keyObj, "Object类型key的值");
myMap.set(keyFunc, "Function类型key的值");

myMap.size; // 3

// 获取值
myMap.get(keyString);
myMap.get(keyObj);
myMap.get(keyFunc);

myMap.get("a string");   // "String类型key的值"
					     // 因为 keyString === 'a string'
myMap.get({});           // undefined, 因为 keyObj !== {}
myMap.get(function() {}) // undefined, 因为 keyFunc !== function () {}

Map对象也可以使用NaN做为key:

var myMap = new Map();
myMap.set(NaN, "not a number");

myMap.get(NaN); // "not a number"

var otherNaN = Number("foo");
myMap.get(otherNaN); // "not a number"

Map对象可使用for..of进行迭代:

var myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");
for (var [key, value] of myMap) {
  console.log(key + " = " + value);
}
// 0 = zero
// 1 = one
for (var key of myMap.keys()) {
  console.log(key);
}
// 0
// 1

for (var value of myMap.values()) {
  console.log(value);
}
// zero
// one

for (var [key, value] of myMap.entries()) {
  console.log(key + " = " + value);
}
// 0 = zero
// 1 = one