Map JavaScript数据结构

发现ES6中引入的Map数据结构,以将数据与键相关联。在引入之前,人们通常通过将一些对象或值与特定的键值相关联来将对象用作地图。

什么是地图

Map数据结构允许将数据与键相关联。

在ES6之前

ECMAScript6(也称为ES2015)将Map数据结构引入了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

输入地图

ES6引入了Map数据结构,为我们提供了处理此类数据组织的适当工具。

通过调用以下方法初始化Map:

const m = new Map()

将项目添加到地图

您可以使用set方法:

m.set('color', 'red')
m.set('age', 2)

通过按键从地图上获取物品

您可以使用来从地图中提取项目get

const color = m.get('color')
const age = m.get('age')

通过按键从地图上删除项目

使用delete()方法:

m.delete('color')

从地图上删除所有项目

使用clear()方法:

m.clear()

通过键检查地图是否包含项

使用has()方法:

const hasColor = m.has('color')

查找地图中的项目数

使用size财产:

const size = m.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

遍历地图

遍历地图键

地图提供keys()我们可以用来迭代所有键的方法:

for (const k of m.keys()) {
  console.log(k)
}

遍历地图值

Map对象提供了values()我们可以用来迭代所有值的方法:

for (const v of m.values()) {
  console.log(v)
}

遍历映射键,值对

Map对象提供了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.keys()]

将地图值转换为数组

const a = [...m.values()]

弱地图

WeakMap是一种特殊的地图。

在地图对象中,永远不会垃圾收集项目。相反,WeakMap允许自由地对其所有项目进行垃圾回收。 WeakMap的每个键都是一个对象。当对该对象的引用丢失时,可以对该值进行垃圾回收。

主要区别如下:

  1. 您不能遍历WeakMap的键或值(或键值)
  2. 您无法从WeakMap清除所有项目
  3. 你不能检查它的大小

WeakMap公开了那些方法,这些方法与Map的方法等效:

  • get(k)
  • set(k, v)
  • has(k)
  • delete(k)

WeakMap的用例不如Map的用例明显,您可能永远找不到它们的需求,但从本质上讲,它可以用于构建对内存敏感的缓存,而不会干扰垃圾回收,或者进行仔细的封装和信息隐藏。

免费下载我的JavaScript初学者手册


更多js教程: