一尘不染

JavaScript中的地图与对象

javascript

我刚刚发现了chromestatus.com,在失去了一天的时间后,发现了以下功能条目:

映射:映射对象是简单的键/值映射。

那让我感到困惑。常规JavaScript对象是字典,那么它Map与字典有何不同?从概念上讲,它们是相同的(根据
Map和Dictionary之间的区别是什么?

chromestatus文档参考也无济于事:

映射对象是键/值对的集合,其中键和值都可以是任意ECMAScript语言值。一个唯一的键值只能出现在地图集合中的一个键/值对中。使用创建地图时选择的比较算法来区分的不同键值。

Map对象可以按插入顺序迭代其元素。必须使用哈希表或其他机制来实现Map对象,这些机制通常平均提供与集合中元素数量成线性关系的访问时间。本Map对象规范中使用的数据结构仅用于描述Map对象所需的可观察语义。它并非旨在成为可行的实施模型。

…对我来说听起来还是一个对象,所以很明显我错过了一些东西。

为什么JavaScript获得了一个(被良好支持的)Map对象?它有什么作用?


阅读 351

收藏
2020-05-01

共1个答案

一尘不染

根据mozilla:

Map对象可以按插入顺序对其元素进行迭代-for..of循环将为每次迭代返回[key,value]数组。

对象与Maps相似,两者都允许您将键设置为值,检索这些值,删除键以及检测是否在键处存储了某些内容。因此,对象在历史上一直被用作地图;但是,对象和地图之间存在重要差异,因此可以更好地使用地图。

对象具有原型,因此地图中包含默认键。但是,可以使用map =
Object.create(null)绕过它。对象的键是字符串,其中键可以是Map的任何值。您可以轻松获取地图的大小,而不必手动跟踪对象的大小。

当键直到运行时才是未知的,并且所有键都是相同的类型并且所有值都是相同的类型时,请在对象上使用映射。

当存在对单个元素进行操作的逻辑时,请使用对象。

有序可迭代性是开发人员长期以来一直希望使用的功能,部分原因是它确保了所有浏览器的相同性能。所以对我来说,那是很大的。

myMap.has(key)方法将特别方便,而且myMap.size属性也很方便。

2020-05-01