Map
对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。
语法
new Map([iterable])
iterable
Iterable 可以是一个数组或者其他 iterable 对象,其元素或为键值对,
或为两个元素的数组。 每个键值对都会添加到新的 Map。null 会被当做 undefined。
Objects 和 maps 的比较
Object 和 Map
类似的是,它们都允许你按键存取一个值、删除键、检测一个键是否绑定了值。因此(并且也没有其他内建的替代方式了)过去我们一直都把对象当成 Map
使用。不过 Map
和 Object
有一些重要的区别,在下列情况里 Map
会是更好的选择:
- 一个对象的键只能是
字符串
或者Symbols
"Symbol()函数会返回symbol类型的值,该类型具有静态属性和静态方法。它的静态属性会暴露几个内建的成员对象;它的静态方法会暴露全局的symbol注册,且类似于内建对象类,但作为构造函数来说它并不完整,因为它不支持语法:"new Symbol()"。"),但一个Map
的键可以是任意值,包括函数、对象、基本类型。 - 你可以通过
size
属性直接获取一个Map
的键值对个数,而Object
的键值对个数只能手动计算。 -
Map
是可迭代的,而Object
的迭代需要先获取它的键数组然后再进行迭代。 -
Object
都有自己的原型,所以原型链上的键名有可能和对象上的键名产生冲突。虽然 ES5 开始可以用map = Object.create(null)
来创建一个没有原型的对象,但是这种用法不太常见。 - Map 在涉及频繁增删键值对的场景下会有些性能优势。
实际使用
/**
* map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
* map() 方法按照原始数组元素顺序依次处理元素。
* 注意: map() 不会对空数组进行检测。
* 注意: map() 不会改变原始数组。
*/
var m = new Map([[1,"x"],[2,"y"],[3,"z"]]);
//返回Map对象的键/值对的数量。
console.log(m.size)
//map赋值
m.set("key","value")
//判断是否有值
m.has("bar"); // false
//返回键对应的值,如果不存在,则返回undefined。
m.get("key")
//移除任何与键相关联的值,并且返回该值,该值在之前会被Map.prototype.has(key)返回为true。
//之后再调用Map.prototype.has(key)会返回false。
m.delete("key")
//返回一个新的 Iterator对象, 它按插入顺序包含了Map对象中每个元素的键 。
m.keys();
//清空map中的值
m.clear();
for of 遍历map
for (var x of m){
//遍历map
console.log(x);
console.log(x[0]);
// test();
// console.log(area_of_circle(3));
}
//Map的回调函数参数依次为value、key和map本身:
m.forEach(function(value,key,map){
console.log('value='+value+',key='+key+',map='+map)
})