【发布时间】:2017-10-02 13:32:49
【问题描述】:
我想知道像 var foo = new Array(20)、var foo = [1,2,3]; foo.length = 10 或 var foo = [,,,] 这样的代码的用例是什么(另外,为什么要使用 delete 运算符而不是仅仅从数组中删除项目) .您可能已经知道,所有这些都将导致稀疏数组。
但是为什么我们被允许做上述事情呢?为什么有人要创建一个默认情况下length 为20 的数组(如第一个示例所示)?为什么有人要修改和破坏数组的length 属性(如第二个示例所示)?为什么有人想做[, , ,] 之类的事情?为什么要使用 delete 而不是仅仅从数组中删除元素?
任何人都可以为这些陈述提供一些用例吗?
我一直在寻找一些答案约 3 小时。没有什么。大多数来源(2ality 博客、JavaScript: The Definitive Guide 6th edition,以及当您搜索“JavaScript 稀疏数组”之类的内容时在 Google 搜索结果中弹出的一大堆其他文章)说稀疏数组是奇怪的行为,你应该远离他们。我读到的任何资料都没有解释,或者至少试图解释,为什么我们一开始就被允许创建稀疏数组。除了 You Don't Know JS: Types & Grammar 之外,这本书讲述了为什么 JavaScript 允许创建稀疏数组:
在其槽中没有显式值但具有暗示槽存在的长度属性的数组是 JS 中一种奇怪的奇异数据结构类型,具有一些非常奇怪和令人困惑的行为。创建此类值的能力纯粹来自旧的、已弃用的历史功能(“类似数组的对象”,如参数对象)。
因此,本书暗示arguments 对象以某种方式在某处使用我上面列出的示例之一来创建稀疏数组。那么,arguments 在哪里以及如何使用稀疏数组?
让我感到困惑的是“JavaScript:权威指南第 6 版”一书中的这一部分:
足够稀疏的数组通常以比密集数组更慢、内存效率更高的方式实现。
“更节省内存”对我来说似乎与“更慢”相矛盾,那么两者之间有什么区别,尤其是在稀疏数组的上下文中? Here 是指向本书特定部分的链接。
【问题讨论】:
-
我认为“纯粹来自旧的、已弃用的历史功能”涵盖了它。 ;)
-
答案很简单,向后兼容或者内存控制
-
@Shard 这就是其他文章所说的。那么,向后兼容是为了什么?它如何帮助记忆控制? Javascript:权威指南说它“稀疏数组很慢,但内存效率更高”,这是什么意思?
-
我唯一一次使用它是填充模板。考虑一个类似表格的结构,如果缺少值,您确实希望呈现空单元格。通过使用固定的数组长度(例如 20),您可以保证使用简单的循环“针对数组中的每个值”创建 20 个单元格。否则,您还必须包括值检查。 '如果值,则呈现值,否则呈现空单元格'。只是一个例子,也可以用不同的方式修复它。
-
@Taurus 向后兼容仍然使用该功能的旧网站。对于内存控制,如果您知道数组中只需要 20 个值,那么您应该指定它。否则后端的动态数组会猜测您的数组的大小并将其设置为比应有的大数百或数千。