JavaScript中“Set”和“Map”的语义区别是什么?

JavaScript中“Set”和“Map”的语义区别是什么?,javascript,Javascript,似乎您可以使用Set执行的所有操作都可以使用Map执行?这是正确的吗 集合和映射之间的语义区别是什么 编辑:链接的“dupe”没有列举两者之间的语义差异。我撤回了我的投票 在谷歌上快速搜索“set vs.hashtable”或“set vs.hashmap”会发现许多这样的问题,主要是在Java标签中,但我没有看到一个答案能够从概念上很好地解决这一差异(尽管有一些链接到相关资源) 让我们从数据结构开始:即值的容器。大多数情况下,这些值可以是任意值。有些数据结构是同质的,有些则不是。有些有限制(例

似乎您可以使用
Set
执行的所有操作都可以使用
Map
执行?这是正确的吗

集合
映射
之间的语义区别是什么


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

我撤回了我的投票

在谷歌上快速搜索“set vs.hashtable”或“set vs.hashmap”会发现许多这样的问题,主要是在Java标签中,但我没有看到一个答案能够从概念上很好地解决这一差异(尽管有一些链接到相关资源)

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

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

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

另一方面,映射*ahem*将键映射到值(索引)。如果我有一个映射
新映射([['a',1]])
,那么
.get('a')
将返回
1
。顺序通常不被认为是重要的地图,关键索引是什么。唯一性也不是唯一性:
newmap([[a',1],[b',1]])
将值1存储两次**,您可以从任意一个键访问它

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


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


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

我收回了我的投票

在谷歌上快速搜索“set vs.hashtable”或“set vs.hashmap”会发现许多这样的问题,主要是在Java标签中,但我没有看到一个答案能够从概念上很好地解决这一差异(尽管有一些链接到相关资源)

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

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

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

另一方面,映射*ahem*将键映射到值(索引)。如果我有一个映射
新映射([['a',1]])
,那么
.get('a')
将返回
1
。顺序通常不被认为是重要的地图,关键索引是什么。唯一性也不是唯一性:
newmap([[a',1],[b',1]])
将值1存储两次**,您可以从任意一个键访问它

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


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


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

集合的可能副本是一个数学集合:一个唯一实体的集合。地图没有这种限制。集合也不是“键控的”:可以按插入顺序迭代它们,但不能在数据结构的上下文中为元素指定有意义的名称(甚至不是整数标记)。集合与映射不同。集合没有键值对。它更像是一个具有唯一值的数组。@BenAston,因为数据结构包含值。钥匙只是访问它们的一种方便方式。映射和集合不提供相同的契约,操作不具有相同的算法复杂性,等等。我可以使用数组实现映射的事实并不意味着映射不相关。还有可读性的角度:如果我读了你的代码并看到一个集合,那么我知道值是唯一的,唯一性很重要,否则你可能会使用数组。@VedranMaricevic是的,通过唯一引用。记住,
{}!=={}
。集合的可能副本是一个数学集合:一个唯一实体的集合。地图没有这种限制。集合也不是“键控的”:可以按插入顺序迭代它们,但不能在数据结构的上下文中为元素指定有意义的名称(甚至不是整数标记)。集合与映射不同。集合没有键值对。它更像是一个具有唯一值的数组。@BenAston,因为数据结构包含值。钥匙只是访问它们的一种方便方式。映射和集合不提供相同的契约,操作不具有相同的算法复杂性,等等。我可以使用数组实现映射的事实并不意味着映射不相关。还有可读性的角度:如果我读了你的代码并