如果我向Javascript数组的第1000个元素添加一个值,那么将该值添加到第0个元素是否有任何不同,假设这些位置是打开的?
我说的是内存消耗。
示例:
arr[1000] = 'asdf';
与
arr[0] = 'asdf';
答案 0 :(得分:2)
由于JavaScript数组实际上是对象,因此内存不是连续的。因此,通过您的示例,访问array[1000]
而不在其他地方存储任何内容将占用与您存储的任何内容相同的内存量(不是1000 *大小的值)。
事实上,按照Danny的答案做var arr = new Array(1000);
并不能创建1000个空插槽的数组。它创建一个具有值length
的{{1}}属性的数组。
以这种方式思考:如果JavaScript不知道它存储的类型和大小,它如何知道要留出多少内存呢?
例如:
1000
有什么说我不能来并在另一个索引处存储一个整数?
var arr = [];
arr[1000] = 'String value';
答案 1 :(得分:0)
如果你有一个大小为1000的数组,你在内存中占用了1000个插槽。
var arr = new Array(1000);
时间复杂度仍为constant for array lookups,因此不会降低您的应用程序速度。
但是,你明确要求内存中有1000个插槽,所以它仍然是一个相当大的空间。虽然内存作为硬件很便宜,但你仍然应该尽可能保持阵列的动态,防止你的程序在内存中占用不必要的空间。
答案 2 :(得分:0)
JavaScript对象本身并没有真正的排序。无论它们是数组还是对象,键的顺序都不重要;一个实现可以按照它想要的顺序放置它们。当然,你必须将它们存储在某些类的顺序中,因此大多数实现都按照你插入它们的顺序保存它们。但这只是巧合:规范并没有强制要求它,并且所以你不能指望它永远是真的。
因此, arr[1000]
不一定是数组的第1000个元素:它只是一个成员,其密钥恰好是1000
。它可能确实是第1000个元素,如果你在它之前插入999个元素和你的运行时将它们按插入顺序保存。但它可能就像第42个元素一样容易。它甚至可能是第一个元素,具体取决于运行时的实现和您自己的代码。
由于Arrays没有排序,分配给arr [1000]不会占用比分配给arr [0] 更多的内存,假设还没有设置任何其他内容。如果你已经设置了999个元素,那么显然设置arr [1000]将导致数组占用比以前更多的空间,因为你必须将该元素存储在某个地方。但它不会占用任何额外的空间,因为它的密钥是1000。