使用new关键字和map构造函数创建一个空映射
const m=new Map();
如果想在创建的同时初始化实例,可以给map构造函数传入一个可迭代的对象,需要包含键/值对数组。可迭代对象中的每个键/值对都会按照迭代顺序插入到新的映射实例中:
const m1=new Map([
['key1','1'],
['key2','2']
])
console.log(m1.size) //2
初始化之后可以使用set方法再添加键值对,size属性获取键值对的数量,delete方法和clear删除值,get和has进行查询。
与object类型的一个主要差别就是,map实例会维护插入的键值对的顺序,可以根据插入顺序进行迭代操作。
映射实例提供了一个迭代器(iterator),能以插入顺序生成[key,val]形式的数组。可以通过entries()方法(symbol.iterator属性,引用entries())取得这个迭代器:
const m1=new Map([
['key1','1'],
['key2','2']
])
console.log(m1.entries===m1[Symbol.iterator]) //true
for(let pair of m1.entries()){
console.log(pair)
//[key1,1]
//[key2,2]
}
因为entries是默认迭代器,可以直接对映射实例使用扩展操作,将映射转化为数组:
const m1=new Map([
['key1','1'],
['key2','2']
])
console.log(...m1)//[[key1,1],[key2,2]]
不使用迭代器可使用回调方式,foreach方法传入回调,依次迭代每个键值对
m1.foreach((val,key)=>console(`${key}-${val}`))
//key1-1
//key2-2
单独遍历key和val
for(let key of m1.keys()){
console.log(key)//key1 key2
}
for(let key of m1.values()){
console.log(key)//1 2
}
对于大多数web开发来说map和object只是个人喜好问题,但是如果看重内存、性能,那么对象和映射之间存在比较显著的区别
不同浏览器的情况不同,但是给定固定大小的内存,map可以比object多存储50%的键值对左右。
两个插入键值对消耗差不多,但是插入map在浏览器中稍微快一点儿,如果涉及到大量插入操作,map更好一点
如果只包含少量键值对,object有时候会比map快。把object当成数组的情况下,浏览器引擎可以进行优化,在内存中 可以使用更高效的布局,这个对map来说是不可能的,如果涉及到很多代码查找操作,object会比map更好
对于大多数浏览器引擎来说,map的delete操作会更好一些。