Javascript 为什么集合的键等于值?

Javascript 为什么集合的键等于值?,javascript,arrays,set,key,Javascript,Arrays,Set,Key,书 理解ECMAScript 6 声明 但是,集合没有键。ECMAScript 6后面的人 标准可以在forEach()的set版本中创建回调函数 接受两个论点,但这会使它与另一个不同 两个。相反,他们找到了一种保持回调函数不变的方法 接受三个参数:集合中的每个值都被视为键和 值。因此,第一个参数和第二个参数在 集合上的forEach(),以使此功能与其他forEach()保持一致 数组和映射上的方法 为什么不制作数组中的键? 这背后的动机是什么?从某种意义上说,Sets实际上有索引,如果没有键

理解ECMAScript 6

声明

但是,集合没有键。ECMAScript 6后面的人 标准可以在forEach()的set版本中创建回调函数 接受两个论点,但这会使它与另一个不同 两个。相反,他们找到了一种保持回调函数不变的方法 接受三个参数:集合中的每个值都被视为键和 值。因此,第一个参数和第二个参数在 集合上的forEach(),以使此功能与其他forEach()保持一致 数组和映射上的方法

为什么不制作数组中的键?

这背后的动机是什么?

从某种意义上说,
Set
s实际上有索引,如果没有键的话

从逻辑上讲,一个集合甚至没有定义的迭代顺序,更不用说键了。但事实是,
新集合([1,2,3])
的迭代顺序不同于
新集合([3,1,2])

这就是数学和编程之间的区别


更新:根据评论讨论更新问题


键/索引实际上不应该存在。如果有一个合理的方法来避免它,我想他们会的。但在编程中,我们不能只说“对于集合中的所有
s
”,我们需要能够迭代这些
s
。但是我们不应该寻找比这个迭代更多的东西。
新集合([1,2,3])
新集合([3,1,2])
应尽可能相似

想象一下,如果我们序列化一个Trie来存储集合
{'baby'、'bad'、'bank'、'box'、'dad'、'dance'}
(b(a(b(y)dn(k))o(x))d(a(dn(c(e)))))
。这根本没有指数。提供这些功能的唯一原因是为了在各种类型之间尽可能保持
forEach
的一致性。这套衣服和其他衣服不太合身。就这些


换句话说,重用值(或者一致地传递一些不相关的标记)比假装迭代索引是
集合
接口的有意义部分更有意义。排序是偶然的,实现细节是必要的,因为程序员不能使用数学技术。但它不是
Set
s的基本接口的一部分。

从某种意义上说,
Set
s实际上有索引,如果没有键的话

从逻辑上讲,一个集合甚至没有定义的迭代顺序,更不用说键了。但事实是,
新集合([1,2,3])
的迭代顺序不同于
新集合([3,1,2])

这就是数学和编程之间的区别


更新:根据评论讨论更新问题


键/索引实际上不应该存在。如果有一个合理的方法来避免它,我想他们会的。但在编程中,我们不能只说“对于集合中的所有
s
”,我们需要能够迭代这些
s
。但是我们不应该寻找比这个迭代更多的东西。
新集合([1,2,3])
新集合([3,1,2])
应尽可能相似

想象一下,如果我们序列化一个Trie来存储集合
{'baby'、'bad'、'bank'、'box'、'dad'、'dance'}
(b(a(b(y)dn(k))o(x))d(a(dn(c(e)))))
。这根本没有指数。提供这些功能的唯一原因是为了在各种类型之间尽可能保持
forEach
的一致性。这套衣服和其他衣服不太合身。就这些


换句话说,重用值(或者一致地传递一些不相关的标记)比假装迭代索引是
集合
接口的有意义部分更有意义。排序是偶然的,实现细节是必要的,因为程序员不能使用数学技术。但是它不是
Set
s的基本界面的一部分。

因为不能通过键访问集合,所以它将是一个无用的参数。为什么不让集合通过键访问呢?为什么集合中的键不像数组中的键那样工作?因为集合没有任何顺序,所以没有任何有用的键可用作键。集合更像是有键但没有值的对象。实际上,键和值是等价的。这就是为什么
forEach()
只是将值作为两个参数传递。因为不能通过键访问集合,所以它将是一个无用的参数。为什么不让集合通过键访问呢?为什么集合中的键不像数组中的键那样工作?因为集合没有任何顺序,所以没有任何有用的键可用作键。集合更像是有键但没有值的对象。实际上,键和值是等价的。这就是为什么
forEach()
只是将值作为两个参数传递。感谢您的回答,Scott。我知道集合的键和值是相同的,以保持
forEach
的一致性。但这里还有一个问题。为什么集合应该是无序的?这又回到了数学。数学集合只是元素的集合。关于集合,唯一合乎逻辑的问题是它是否包含特定元素。出于编程目的,我们还需要包括添加、删除和列出元素的功能,但这些都不是
集合的基本概念。我们已经有了有序的集合和数组,所以没有理由在新类型中复制它们。顺便说一句,有些语言坚持以随机顺序迭代它们的集合,只是为了确保没有人依赖于意外的顺序。谢谢你的回答,Scott。我知道集合的键和值是相同的,以保持
forEach
的一致性。但这里还有一个问题。为什么集合应该是无序的?这又回到了数学。数学的