什么是密集阵列?

Wat*_* v2 11 javascript arrays

我从几页读到的密集阵列的解释似乎彼此矛盾.我想要一些帮助来理解它是什么.

虽然一些链接(搜索结果1,搜索结果2)表明它只是一个数组,其中:

  1. 已知数组的元素是特定值; 和
  2. 在初始化时分配给数组.

暗示JavaScript数组是密集的.

直到这里才有意义.

但是,这篇来自Mozilla开发者网络(MDN)JavaScript指南的声明说:

由于数组的长度可以随时改变,并且数据可以存储在数组中的非连续位置,因此不能保证 JavaScript数组 密集 ; 这取决于程序员如何选择使用它们.一般来说,这些都是方便的特征; 但如果这些功能不适合您的特定用途,您可以考虑使用类型化数组.

这让我很困惑.我的问题是:

MDN页面上的语句是什么意思,它说JavaScript数组不能保证密集?如果它意味着以下不是密集数组,因为它的一个或多个元素是undefined在初始化时,那么为什么我上面列出的链接似乎表明JavaScript数组确实是密集的?

var array = new Array(1, , 3, ); // [1, undefined, 3, undefined]
Run Code Online (Sandbox Code Playgroud)

Ama*_*dan 14

"密集"与"稀疏"相反,通常在谈论存储时使用.例如,此数组是密集的:

a = [undefined, undefined, 2]
Run Code Online (Sandbox Code Playgroud)

它可以完全像存储在内存中:三个位置的序列,前两个是undefined,第三个是2.

这个数组很稀疏:

a = []
a[100000000] = 100000000
Run Code Online (Sandbox Code Playgroud)

它不是作为100000001个位置的序列存储在存储器中,因为它将非常低效.绝对不是随后的100000000地方.相反,它只是表示100000000 ,并且没有空间分配给前100000000个元素.undefined100000000100000000

(实际上,尝试用它2来代替100000000,并且你会注意到一个奇怪的事情:Chrome将显示密集数组[undefined, undefined, 2],但稀疏数组显示为[undefined × 2, 2].)

  • 我不知道极其低效是否正确,我认为 Underscore.js 的维护者在这一点上争论不休,导致 Underscore 的分支,后来被称为 Lodash。 (2认同)
  • 我会说你真的不能争论:分配 100000000 个内存位置来存储一个值是低效的。这不是一般性的陈述(“密集数组效率低下”),而是针对这种情况的特定陈述。 (2认同)

Lui*_*lli 5

那些文章说你可以创建一个密集的数组。这意味着,在创建时,此类数组密集的,因为在以下数组中:

var a = new Array("foo", "bar", "baz");
var b = [2, 3, 5];
Run Code Online (Sandbox Code Playgroud)

每个元素都被设置:从 0 到 length-1,没有未定义的值。或者更好地说:从 0 到 length-1 的每个位置都分配了一个值(即使该值实际上是undefined)。

但是,您可以通过执行以下操作使这些数组不再密集:

a[20] = "bat";
Run Code Online (Sandbox Code Playgroud)

那个密集的数组不再是密集的,因为元素 0 1 2 和 20(与 3 到 19 中的元素不同)被设置为一个值(这个数组有 4 个元素,而不是 21)。