我从几页读到的密集阵列的解释似乎彼此矛盾。我想帮助理解它是什么。
虽然有些链接(search result 1,search result 2)表明它只是一个数组:
有人认为JavaScript数组很密集。
直到这里才有意义。
但是这句话来自JavaScript Guide on the Mozilla Developer Network (MDN)说:
由于数组的长度可以随时更改,并且数据可以存储在数组中的非连续位置,因此JavaScript数组是 不保证密集;这取决于程序员选择的方式 使用它们。一般来说,这些都是方便的特征;但如果 您可能会将这些功能用于特定用途 考虑使用类型化数组。
这让我很困惑。我的问题是:
MDN页面上的语句是什么意思,它说JavaScript数组不能保证密集?如果它意味着以下不是密集数组,因为在初始化时它的一个或多个元素是undefined
,那么为什么上面列出的链接似乎表明JavaScript数组确实是密集的?
var array = new Array(1, , 3, ); // [1, undefined, 3, undefined]
答案 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)。