Javascript如何';如何构造稀疏阵列?每个索引中放置了什么?

Javascript如何';如何构造稀疏阵列?每个索引中放置了什么?,javascript,v8,Javascript,V8,我知道这个问题没有实际用途,但我读过很多关于什么是稀疏数组的不同定义,我想知道这些动态数组是如何创建的 稀疏数组是指针数组吗?或者它像某种结构节点的数组?或者它是一个通用的大空间,可以填充一些小的东西,比如字符,或者一些大的东西,比如浮点数 如果阵列只是略微稀疏,则背衬阵列是连续的,其中孔索引具有孔值。当用户取消引用时,孔值转换为未定义。带有值的索引也不会通过Object.keys等方法报告为存在于数组中 如果数组更稀疏,那么它只是一个以数字为键的哈希表 与注释中所说的不同,数组总是被假定为非稀

我知道这个问题没有实际用途,但我读过很多关于什么是稀疏数组的不同定义,我想知道这些动态数组是如何创建的


稀疏数组是指针数组吗?或者它像某种结构节点的数组?或者它是一个通用的大空间,可以填充一些小的东西,比如字符,或者一些大的东西,比如浮点数

如果阵列只是略微稀疏,则背衬阵列是连续的,其中孔索引具有
值。当用户取消引用时,
值转换为
未定义
。带有
值的索引也不会通过
Object.keys
等方法报告为存在于数组中

如果数组更稀疏,那么它只是一个以数字为键的哈希表


与注释中所说的不同,数组总是被假定为非稀疏的,并且只是作为最后的手段而转换为哈希表,而不是相反。当您为数组索引定义自定义属性描述符(永远不要这样做)或使数组过于稀疏时,就会发生这种情况。

这取决于实现。但通常是哈希表。数组是哈希表,除非/直到可以证明有更好的匹配。例如,在V8中,即使是
[1,2,3]
也会以散列的形式开始使用,直到优化例程意识到uIntArray工作得更好,并透明地转换它。如果没有可用的升级,它将停留在哈希表中。我不久前读到,当您使用稀疏数组功能时,一些引擎会自动从数组/向量切换到哈希表。。。好吧,丹达维斯说:)它可能会走向另一个方向,因为从一个正常的开始会导致一个类型error@dandavis:你确定吗?我非常确定整数索引总是存储在数组中(即使是在普通对象上)。这个数组通常会动态增长,但是如果索引变得太稀疏,那么可能就是它切换到字典模式的时候了。谢谢你从评论中确认我的想法。你能详细说明“太稀疏”吗?@Bergi好的,所以基本上不检查元素少于5000的数组在新数组时是否太稀疏。如果它们是旧的(例如,通常存活5次gc收集左右),则该限制为500。如果阵列大于此值,则检查间隙大小是否为1024。因此,大于1024的两个连续元素之间的距离“太稀疏”。