这本书
了解ECMAScript 6
说明
设置没有键。 ECMAScript 6背后的人 标准可以在forEach()的set版本中进行回调函数 接受两个参数,但这会使它与另一个不同 二。相反,他们找到了一种方法来保持回调函数相同 接受三个参数:集合中的每个值都被认为是关键和 值。因此,第一个和第二个参数总是相同的 forEach()on sets保持此功能与其他forEach()保持一致 数组和地图上的方法。
为什么不像在阵列中那样制作键?
这背后的动机是什么?
答案 0 :(得分:2)
从某种意义上说,Set
实际上确实有索引,如果不是键......
逻辑上,一个集合甚至没有定义的迭代顺序,更不用说密钥了。但事实是,new Set([1, 2, 3])
的迭代次序与new Set([3, 1, 2])
不同。
这是数学和编程之间的区别。
更新:通过评论讨论更新了问题
密钥/索引确实不应该存在。如果有合理的方法可以避免它,我认为他们会有。但是在编程中我们不能只说“集合s
中的所有S
...”我们需要能够迭代那些s
。但我们不应该寻找比这个迭代更多的东西。 new Set([1, 2, 3])
和new Set([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
接口的有意义部分更有意义。订购是偶然的,实现细节,因为程序员不能使用数学技术。但它不是Set
s。