为什么JS在Set中保持插入顺序?

Axs*_*Axs 15 javascript set ecmascript-6

随机试验 JavaScript (ES6) 并阅读其文档,我发现它Set保持其元素的插入顺序。

我想知道这个决定背后的理由是什么?我一直认为集合是一个无序的集合。需要更多的东西会导致更昂贵的实现,而在我看来,这个功能大多未使用。

geo*_*org 19

有序集非常有用,例如考虑:

unique_elements_in_order = [...new Set(some_array)]
Run Code Online (Sandbox Code Playgroud)

在“未排序的集合”语言中,例如 python,您需要一个单独的OrderedSet实现才能使其工作。

是的,理论上,集合不是有序的,但是数学抽象,如集合、函数、数字等,只与我们在编程中使用的名称相似的对象相切相关。Set只是一种特殊的数据结构,由语言设计者来定义它的特定属性,例如“集合按插入顺序排列”或“集合只能包含可散列对象”等。

至于委员会的动机,一些谷歌搜索带来了这个

马克·S·米勒:

太平洋标准时间 2012 年 2 月 13 日星期一 22:31:28

决定论有很多好处。E 以不确定的迭代顺序开始,这打开了一个隐蔽的通道危险。我最初更改为确定性顺序只是为了堵住这个泄漏。这样做之后,我发现它有很多软件工程的好处。例如,编写回归测试和通过重新执行重现错误变得更加容易。在我的实现中,它还有一点额外的空间和时间成本。Tyler 的 Waterken 表表明,即使是我支付的微小运行成本也是不必要的。

我们不要为了无法衡量的效率而引入另一个不确定性来源。让我们衡量一下,如果结果证明成本毕竟很高,那么让我们重新考虑确定性。

  • 有趣的是,golang 有完全相反的哲学 (3认同)