什么是地图
一个Map数据结构允许将数据与一个键相关联。
在ES6之前
ECMAScript6(也叫ES2015)将Map数据结构和Set一起引入了JavaScript世界。
在它被引入之前,人们通常使用对象作为地图,通过将一些对象或值与特定的键值联系起来。
const car = {}
car['color'] = 'red'
car.owner = 'Flavio'
console.log(car['color']) //red
console.log(car.color) //red
console.log(car.owner) //Flavio
console.log(car['owner']) //Flavio
输入Map
ES6引入了Map数据结构,为我们提供了一个合适的工具来处理这种数据组织。
一个Map是通过调用来初始化的。
向地图添加项目
你可以通过使用set 方法将项目添加到地图中。
m.set('color', 'red')
m.set('age', 2)
通过键从地图中获取一个项目
而你可以通过使用get 来从地图中获取项目。
const color = m.get('color')
const age = m.get('age')
通过键从地图中删除一个项目
使用delete() 方法。
从地图中删除所有项目
使用clear() 方法。
按键检查一个地图是否包含一个项目
使用has() 方法。
const hasColor = m.has('color')
查找地图中的项目数量
使用size 属性。
用数值初始化一个地图
你可以用一组值来初始化一个地图。
const m = new Map([['color', 'red'], ['owner', 'Flavio'], ['age', 2]])
地图键
就像任何值(对象、数组、字符串、数字)都可以作为地图项的键值项的值一样,任何值都可以作为键,甚至是对象。
如果你试图用get() ,从地图中获取一个不存在的键,它将返回undefined 。
在现实生活中,你几乎不会发现奇怪的情况
const m = new Map()
m.set(NaN, 'test')
m.get(NaN) //test
const m = new Map()
m.set(+0, 'test')
m.get(-0) //test
遍历一个地图
遍历地图的键
Map提供了keys() 方法,我们可以用它来迭代所有的键。
for (const k of m.keys()) {
console.log(k)
}
遍历地图值
Map对象提供了values() 方法,我们可以用它来迭代所有的值。
for (const v of m.values()) {
console.log(v)
}
遍历地图的键、值对
地图对象提供了entries() 方法,我们可以用它来迭代所有的值。
for (const [k, v] of m.entries()) {
console.log(k, v)
}
这可以简化为
for (const [k, v] of m) {
console.log(k, v)
}
转换为数组
将地图的键转换成一个数组
将地图的值转换成一个数组
const a = [...m.values()]
弱图(WeakMap
WeakMap是一种特殊的地图。
在一个地图对象中,项目永远不会被垃圾回收。而WeakMap则允许其所有项目自由地被垃圾回收。WeakMap的每个键都是一个对象。当这个对象的引用丢失时,其值可以被垃圾回收。
以下是主要的区别。
- 你不能遍历WeakMap的键或值(或键值)。
- 你不能清除WeakMap中的所有项目
- 不能检查其大小
WeakMap暴露了这些方法,它们等同于Map的方法。
get(k)set(k, v)has(k)delete(k)
WeakMap的用例没有Map那么明显,而且你可能永远不会发现对它们的需求,但基本上它可以用来建立一个对内存敏感的、不会干扰垃圾回收的缓存,或者用于仔细的封装和信息隐藏。