请选择 进入手机版 | 继续访问电脑版

JavaScript Map 数据结构

前端开发  / Javascript  / 倒序浏览   © 著作权归作者本人所有

#楼主# 2020-5-16

跳转到指定楼层

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

什么是地图

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

在ES6之前

在引入之前,人们通常通过将某些对象或值与特定的键值相关联来将对象用作地图:

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

遍历地图

遍历地图键

Map提供了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的用例明显,您可能永远找不到它们的需要,但是从本质上讲,它可以用于构建对内存敏感的缓存,而不会干扰垃圾回收,或者进行仔细的封装和信息隐藏。

转播转播
回复

使用道具

成为第一个评论人

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于作者

damonare

网站编辑

  • 主题

    267

  • 帖子

    269

  • 关注者

    0

手机版|ObjectX 超对象 |粤ICP备20005929号
Powered by  © 2019-2020版权归ObjectX 超对象