javascript - 为什么JS在Set中保持插入顺序?
问题描述
随机试验 JavaScript (ES6) 并阅读它的文档,我发现它Set
保持了其元素的插入顺序。
我想知道这个决定背后的理由是什么?我一直认为集合是无序的集合。要求更多会导致实现成本更高,而在我看来,此功能大多未使用。
解决方案
有序集非常有用,例如:
unique_elements_in_order = [...new Set(some_array)]
在像 python 这样的“未排序集”语言中,您需要一个单独的OrderedSet
实现才能使其工作。
是的,理论上,集合不是有序的,但数学抽象,如集合、函数、数字等,仅与我们在编程中使用的类似命名的对象有切线相关。Set
只是一种特殊的数据结构,由语言设计者定义其特定属性,例如“集合在插入顺序中”或“集合只能包含可散列对象”等。
至于委员会的动机,一些谷歌搜索带来了这个
马克·米勒:
2012 年 2 月 13 日星期一 22:31:28 PST
确定性有很多好处。E 以非确定性迭代顺序开始,这会带来隐蔽通道风险。我最初更改为确定性顺序只是为了堵住这个漏洞。这样做后,我发现它具有许多软件工程优势。例如,编写回归测试和通过重新执行来重现错误变得更加容易。在我的实现中,它还有一点额外的空间和时间成本。Tyler 的 Waterken 表表明,即使是我支付的少量运行时成本也是不必要的。
让我们不要为了无法衡量的效率而引入另一个非确定性来源。让我们衡量一下,如果最终成本很高,那么让我们重新考虑确定性。
推荐阅读
- c++ - The scalar type additionnal in C++
- java - 如何在某些缩放级别禁用 zoomIn/zoomOut 按钮,例如:分别为 zoomlevel 18 和 zoomlevel 0
- reporting-services - 如果文本框被隐藏,则隐藏一行
- android - 使用开关按钮启用和禁用 Firebase 通知
- kubernetes - 在 Pod 初始化后在作业中使用 initcontainers 做一些事情
- javascript - 执行缓慢移动且 settimeout 未按预期工作的脚本
- azure - Azure 构建管道,包括带有 Atlassian Bitbucket 的 WebJobs
- node.js - 如何获得 V8 运行时指标?
- csv - Jmeter - CSV 文件 - 将值从全局 csv 发送到本地 csv
- ios - 如何在谷歌地图中处理标记簇中的单个标记