为什么 JavaScript 集/映射使用“大小”而不是“长度”

Why do JavaScript Sets/Maps use `size` instead of `length`?

本文关键字:大小 长度 JavaScript 映射 为什么      更新时间:2023-09-26

在查看JavaScript的新更改时,我注意到SetMap使用.size而不是像数组那样使用.length

这似乎是对数组正常情况的毫无意义的转移 - 只是要记住的另一件事。

这有很好的设计理由吗?

在es討論主題"Set length property"中有很多討論。这是一个激烈争论的问题,所以你不一定同意该决议也就不足为奇了。

在讨论中对此进行了大量的争论。最终,占上风的论点(正如ES2015的集合有size而不是length的事实所证明的那样)在David Bruant的一篇文章中进行了总结:

。对我来说,"长度"是指用尺子之类的东西进行测量。你从 0 开始,看看它的发展方向。这对于一个索引集的数组(从 0 开始并增长)和 C(连续字节序列)中考虑的数组来说非常准确,ECMAScript 数组似乎受到启发。这可能与无序集合不太相关,例如我倾向于认为是凌乱的袋子的集合。

并在Dean Landolt的一篇文章中进一步讨论:

只是想跳进去说不可写length也与字符串行为一致,但 David 对暗示度量拓扑length提出了一个很好的观点。大卫对count的建议很好。我们正在谈论的ISTM是cardinality,但没有必要太愚蠢的精度。虽然size对我来说很好,并且有很多现有技术。

虽然 apsillers 的 2016 年 1 月 27 日的答案添加了很好的链接,但缺少代码示例。集合的size是只读的getter,而允许修改length以截断数组的数组则不是这种情况。

let arr = [1, 2, 3, 4]
arr.length = 2
console.log("modified length array", arr) // [1, 2]
let mySet = new Set([1, 2, 3, 4])
mySet.length = 2
mySet.size = 2
console.log("modified length set", [...mySet]) // [1, 2, 3, 4]
let str = "1234"
str.length = 2
console.log("modified length string", str) // "1234"