JavaScript 的 Array.prototype.fill() 总是创建一个打包数组吗?

问题描述 投票:0回答:1

根据此讨论,一旦 JavaScript 数组在其生命周期中的任何时候变得稀疏,它就会永远保持

holey
。但如果我是一名 V8 开发人员,我可能会优化 Array.prototype.fill(),以便在整体调用时始终将底层数据结构升级为
packed
,例如
Array(10).fill()
因为它没有理由不能并且不会增加太多开销。 (我知道需要考虑 setter 和原型继承,但适用于打包数组的
Array.prototype.push()
也是如此。)

所以我的问题是:在这种情况下,在数组的整个长度上调用 Array.prototype.fill() 的情况下,V8 实际上是否优化了多孔数组以成为打包数组?在用值填充之前,只需为其数据结构创建一个新的底层打包数组非常容易。如果不是那为什么不呢?

javascript arrays v8 fill packed
1个回答
0
投票

(这里是 V8 开发者。)

目前的状态是

A.p.fill()
永远不会改变它所操作的数组的多孔性/填充性。

请注意,“有洞”与“稀疏”(又名“字典模式”)有很大不同。当您说“其数据结构的底层打包数组”时,多孔数组仍然具有您可能的意思(我将其称为“类似数组的后备存储”,而不是“字典后备存储”)。

A.p.fill
从技术上来说可以将数组标记为打包的,也许应该这样做,这肯定已经被讨论过。当前行为的原因包括:

  • 在不同状态之间重复翻转同一数组很容易产生负面(和非局部)影响,通常最好让内部表示和其他选择稳定到当前应用程序需要的任何状态。
  • 多孔数组和压缩数组之间的差异非常小,以至于很多时候根本不重要。

所以,总而言之:不用担心。

© www.soinside.com 2019 - 2024. All rights reserved.