Map
对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。
语法:
new Map([iterable])
参数 iterable 可以是一个数组或者其他 iterable 对象,其元素或为键值对,或为两个元素的数组。 每个键值对都会添加到新的 Map。null 会被当做 undefined。
示例:
使用映射对象:
var myMap = new Map();var keyObj = {},keyFunc = function () {},keyString = "a string";// 添加键
myMap.set(keyString, "和键'a string'关联的值");
myMap.set(keyObj, "和键keyObj关联的值");
myMap.set(keyFunc, "和键keyFunc关联的值");myMap.size; // 3// 读取值
myMap.get(keyString); // "和键'a string'关联的值"
myMap.get(keyObj); // "和键keyObj关联的值"
myMap.get(keyFunc); // "和键keyFunc关联的值"myMap.get("a string"); // "和键'a string'关联的值"// 因为keyString === 'a string'
myMap.get({}); // undefined, 因为keyObj !== {}
myMap.get(function() {}) // undefined, 因为keyFunc !== function () {}
将NAN作为映射的键:
NaN
也可以作为Map对象的键. 虽然 NaN
和任何值甚至和自己都不相等(NaN !== NaN
返回true), 但下面的例子表明, 两个NaN
作为Map的键来说是没有区别的:
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"
使用 for...of 循环进行迭代映射:
var myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");
for (var [key, value] of myMap) {console.log(key + " = " + value);
}
// 将会显示两个log。一个是"0 = zero"另一个是"1 = one"for (var key of myMap.keys()) {console.log(key);
}
// 将会显示两个log。 一个是 "0" 另一个是 "1"for (var value of myMap.values()) {console.log(value);
}
// 将会显示两个log。 一个是 "zero" 另一个是 "one"for (var [key, value] of myMap.entries()) {console.log(key + " = " + value);
}
// 将会显示两个log。 一个是 "0 = zero" 另一个是 "1 = one"
使用forEach()方法进行迭代映射:
myMap.forEach(function(value, key) {console.log(key + " = " + value);
}, myMap)
// 将会显示两个logs。 一个是 "0 = zero" 另一个是 "1 = one"
映射与数组对象的关系:
var myArray = [["key1", "value1"], ["key2", "value2"]];// 使用映射对象常规的构造函数将一个二维键值对数组对象转换成一个映射关系
var myMap = new Map(myArray);myMap.get("key1"); // 返回值为 "value1"// 使用展开运算符将一个映射关系转换成一个二维键值对数组对象
console.log(uneval([...myMap])); // 将会向您显示和kvArray相同的数组// 或者使用展开运算符作用在键或者值的迭代器上,进而得到只含有键或者值得数组
console.log(uneval([...myMap.keys()])); // 输出 ["key1", "key2"]