根据此讨论,一旦 JavaScript 数组在其生命周期中的任何时候变得稀疏,它就会永远保持
holey
。但如果我是一名 V8 开发人员,我可能会优化 Array.prototype.fill(),以便在整体调用时始终将底层数据结构升级为 packed
,例如Array(10).fill()
因为它没有理由不能并且不会增加太多开销。 (我知道需要考虑 setter 和原型继承,但适用于打包数组的 Array.prototype.push()
也是如此。)
所以我的问题是:在这种情况下,在数组的整个长度上调用 Array.prototype.fill() 的情况下,V8 实际上是否优化了多孔数组以成为打包数组?在用值填充之前,只需为其数据结构创建一个新的底层打包数组非常容易。如果不是那为什么不呢?
(这里是 V8 开发者。)
目前的状态是
A.p.fill()
永远不会改变它所操作的数组的多孔性/填充性。
请注意,“有洞”与“稀疏”(又名“字典模式”)有很大不同。当您说“其数据结构的底层打包数组”时,多孔数组仍然具有您可能的意思(我将其称为“类似数组的后备存储”,而不是“字典后备存储”)。
A.p.fill
从技术上来说可以将数组标记为打包的,也许应该这样做,这肯定已经被讨论过。当前行为的原因包括:
所以,总而言之:不用担心。