Wat*_* v2 11 javascript arrays
我从几页读到的密集阵列的解释似乎彼此矛盾.我想要一些帮助来理解它是什么.
虽然一些链接(搜索结果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].)
那些文章说你可以创建一个密集的数组。这意味着,在创建时,此类数组是密集的,因为在以下数组中:
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)。