繁体   English   中英

JavaScript中的Set和Map之间在语义上有何区别?

[英]What are the semantic differences between `Set` and a `Map` in JavaScript?

似乎您可以使用Set所有操作都可以使用Map 这个对吗?

SetMap之间在语义上有什么区别?

编辑:链接的“重复”不枚举两者之间的语义差异。

我撤回了我的密切投票。

一个快速的“ set vs. hashtable”或“ set vs. hashmap”的google出现了很多SO问题,主要是在Java标记中,但是我没有看到一个实际的答案可以用一种很好的概念性方式解决差异(尽管一些与相关资源相关的链接)。

让我们先从什么数据结构 :值即容器。 这些值大部分可以是任何值。 有些数据结构是同质的,有些则不是。 有些具有限制(例如Map可以具有任意键,但POJO只能具有字符串或符号键),有些则没有,某些是有序的,有些则没有,等等。所有这些折衷通常都取决于性能。

集合是保存唯一值的数据结构。 让我们与一个数组进行比较:

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

像数组或列表一样,JavaScript中的集合是线性的:您可以按顺序遍历它们。 但是与数组(更像列表)不同的是,集没有被索引。 您不能说new Set(1)[0];

另一方面,* ahem * 映射到值(索引)。 如果我有一个Map new Map([['a',1]]) ,那么.get('a')将返回1 对于Maps而言,对于关键索引而言,顺序通常并不重要。 也不是唯一性: new Map([['a', 1], ['b', 1]])将值1两次存储**,您可以从任一键访问它。

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


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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM