首页 > 解决方案 > 为什么JS在Set中保持插入顺序?

问题描述

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

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

标签: javascriptecmascript-6set

解决方案


有序集非常有用,例如:

unique_elements_in_order = [...new Set(some_array)]

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

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

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

马克·米勒:

2012 年 2 月 13 日星期一 22:31:28 PST

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

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


推荐阅读