属性
Map.length
属性 length 的值为 0 。
想要计算一个Map
中的条目数量, 使用Map.prototype.size
.本构造函数用于创建派生对象。
表示
Map
构造器的原型。 允许添加属性从而应用于所有的Map
对象。
Map
实例 属性
Map.prototype.constructor
返回一个函数,它创建了实例的原型。默认是
Map
函数。返回Map对象的键/值对的数量。
Map实例 方法
移除Map对象的所有键/值对 。
如果
Map
对象中存在该元素,则移除它并返回true
;否则如果该元素不存在则返回false
。随后调用Map.prototype.has(key)
将返回false
。返回一个新的
Iterator
对象,它按插入顺序包含了Map对象中每个元素的[key, value]
数组
。
Map.prototype.forEach(callbackFn[, thisArg])
按插入顺序,为
Map
对象里的每一键值对调用一次callbackFn函数。如果为forEach提供了thisArg,它将在每次回调中作为this值。返回键对应的值,如果不存在,则返回undefined。
返回一个布尔值,表示Map实例是否包含键对应的值。
返回一个新的
Iterator
对象, 它按插入顺序包含了Map对象中每个元素的键 。设置Map对象中键的值。返回该Map对象。
返回一个新的
Iterator
对象,它按插入顺序包含了Map对象中每个元素的值 。返回一个新的
Iterator
对象,它按插入顺序包含了Map对象中每个元素的[key, value]
数组
。
示例
使用 Map 对象
let myMap = new Map();
let keyObj = {};
let keyFunc = function() {};
let 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 作为 Map 的键
NaN 也可以作为Map对象的键。虽然 NaN 和任何值甚至和自己都不相等(NaN !== NaN 返回true),但下面的例子表明,NaN作为Map的键来说是没有区别的:
let myMap = new Map();
myMap.set(NaN, "not a number");
myMap.get(NaN); // "not a number"
let otherNaN = Number("foo");
myMap.get(otherNaN); // "not a number"
使用 for..of 方法迭代 Map
Map可以使用for..of循环来实现迭代:
let myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");
for (let [key, value] of myMap) {
console.log(key + " = " + value);
}
// 将会显示两个log。一个是"0 = zero"另一个是"1 = one"
for (let key of myMap.keys()) {
console.log(key);
}
// 将会显示两个log。 一个是 "0" 另一个是 "1"
for (let value of myMap.values()) {
console.log(value);
}
// 将会显示两个log。 一个是 "zero" 另一个是 "one"
for (let [key, value] of myMap.entries()) {
console.log(key + " = " + value);
}
// 将会显示两个log。 一个是 "0 = zero" 另一个是 "1 = one"
Map 与数组的关系
let kvArray = [["key1", "value1"], ["key2", "value2"]];
// 使用常规的Map构造函数可以将一个二维键值对数组转换成一个Map对象
let myMap = new Map(kvArray);
myMap.get("key1"); // 返回值为 "value1"
// 使用Array.from函数可以将一个Map对象转换成一个二维键值对数组
console.log(Array.from(myMap)); // 输出和kvArray相同的数组
// 更简洁的方法来做如上同样的事情,使用展开运算符
console.log([...myMap]);
// 或者在键或者值的迭代器上使用Array.from,进而得到只含有键或者值的数组
console.log(Array.from(myMap.keys())); // 输出 ["key1", "key2"]
复制或合并 Maps ------------ !!! 重要:请记住,数据本身未被克隆 !!!
//Map 能像数组一样被复制:
let original = new Map([
[1, 'one']
]);
let clone = new Map(original);
console.log(clone.get(1)); // one
console.log(original === clone); // false. 浅比较 不为同一个对象的引用
Map对象间可以进行合并,但是会保持键的唯一性。
let first = new Map([
[1, 'one'],
[2, 'two'],
[3, 'three'],
]);
let second = new Map([
[1, 'uno'],
[2, 'dos']
]);
// 合并两个Map对象时,如果有重复的键值,则后面的会覆盖前面的。
// 展开运算符本质上是将Map对象转换成数组。
let merged = new Map([...first, ...second]);
console.log(merged.get(1)); // uno
console.log(merged.get(2)); // dos
console.log(merged.get(3)); // three
Map对象也能与数组合并:
let first = new Map([
[1, 'one'],
[2, 'two'],
[3, 'three'],
]);
let second = new Map([
[1, 'uno'],
[2, 'dos']
]);
// Map对象同数组进行合并时,如果有重复的键值,则后面的会覆盖前面的。
let merged = new Map([...first, ...second, [1, 'eins']]);
console.log(merged.get(1)); // eins
console.log(merged.get(2)); // dos
console.log(merged.get(3)); // three
使用说明
请注意!为Map设置对象属性也是可以的,但是可能引起大量的混乱。
所以,你还是可以这样做...
let wrongMap = new Map() wrongMap['bla'] = 'blaa' wrongMap['bla2'] = 'blaaa2' console.log(wrongMap) // Map { bla: 'blaa', bla2: 'blaaa2' }...但是,这样做的话,它的行为会不符合预期:
wrongMap.has('bla') // false wrongMap.delete('bla') // false console.log(wrongMap) // Map { bla: 'blaa', bla2: 'blaaa2' }
无论如何,和正确用法比较起来,几乎没有什么不同:
let myMap = new Map() myMap.set('bla','blaa') myMap.set('bla2','blaa2') console.log(myMap) // Map { 'bla' => 'blaa', 'bla2' => 'blaa2' } myMap.has('bla') // true myMap.delete('bla') // true console.log(myMap) // Map { 'bla2' => 'blaa2' }