JavaScript中“Set”和“Map”之间的语义差异是什么?

时间:2017-06-27 12:32:13

标签: javascript

您可以使用Set处理Map所做的一切?这是对的吗?

SetMap之间的语义差异是什么?

编辑:链接的“欺骗”没有列举两者之间的语义差异。

1 个答案:

答案 0 :(得分:2)

我已经撤回了我的近距离投票。

快速google'设置与哈希表'或者'设置与hashmap'提出了大量的SO问题,主要是在Java标签中,但我没有看到一个单独的答案,实际上以一种良好的概念方式解决了差异(尽管有一些与相关资源有关)。

让我们从 的数据结构开始:即值的容器。这些值在大多数情况下都可以是任何值。有些数据结构是同质的,有些则不是。有些人有限制(例如,Map可以有任意键,但POJO只能有字符串或符号键),有些没有,有些是有序的,有些是不是等等。所有这些权衡通常归结为性能

Set是一种包含唯一值的数据结构。让我们与一个数组进行比较:

Array.from(new Set([1,2,2,3])).toString() === [1,2,2,3].toString();
// false

与数组或列表类似,JavaScript中的集合是线性的:您可以按顺序遍历它们*。但与数组(更像列表)不同,集合未编入索引。你不能说new Set(1)[0];

另一方面,

地图* ahem * 映射键到值(索引)。如果我有地图new Map([['a',1]]),则.get('a')将返回1。对于地图而言,订单通常不被认为是重要的,即关键索引的用途。也不是唯一性:new Map([['a', 1], ['b', 1]])将值1存储两次**,您可以从任一键访问它。

即使像我一样,你主要是一名自学成才的程序员,我强烈建议你熟悉基本的数据结构,因为它提供了对问题识别和一般解决方案的宝贵见解。如果您发现自己经常使用Array.prototype.shift,则可能需要FIFO队列/链接列表。

*通常设置无序,插入顺序的保留是JavaScript的事情。

**底层实现可能只作为优化存储一次,但这是一个实现细节,对用户来说是不透明的。