什么是密集阵列?

时间:2016-08-19 02:23:44

标签: javascript arrays

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

虽然有些链接(search result 1search result 2)表明它只是一个数组:

  1. 已知数组的元素是特定值;和
  2. 在初始化时分配给数组。
  3. 有人认为JavaScript数组很密集。

    直到这里才有意义。

    但是这句话来自JavaScript Guide on the Mozilla Developer Network (MDN)说:

      

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

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

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

    var array = new Array(1, , 3, ); // [1, undefined, 3, undefined]
    

2 个答案:

答案 0 :(得分:13)

"密集"反对"稀疏",并且通常在谈论存储时使用。例如,此数组是密集的:

a = [undefined, undefined, 2]

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

这个数组很稀疏:

a = []
a[100000000] = 100000000

它没有作为100000001个位置的序列存储在内存中,因为它的效率非常低。绝对不是100000000的{​​{1}}个地方,后跟undefined。相反,它只是说100000000th是100000000,并且没有空间分配给前100000000个元素。

(实际上,请尝试使用100000000代替2执行此操作,并且您会注意到一个奇怪的事情:Chrome会将密集数组显示为100000000,但是稀疏的[undefined, undefined, 2]。)

答案 1 :(得分:4)

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

var a = new Array("foo", "bar", "baz");
var b = [2, 3, 5];

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

但是,你可以通过这样的方式使这些数组不再密集:

a[20] = "bat";

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