内存分配给数组

时间:2012-04-07 15:50:13

标签: javascript

我想知道如果有一个以高值开头的数组,是否有人知道如何使用JS数组处理内存。

例如,如果你有:

array[5000] = 1; 

作为数组中的第一个值,5000之前的所有内容根本就不存在,分配给数组的内存量是否适合于之前未分配的4999个位置...或者它只会将内存分配给值[5000]的数组?

我正在努力减少用于我的脚本的内存量,所以这让我想知道这个问题:)

3 个答案:

答案 0 :(得分:2)

5000键分配值时,不会填充整个数组:

var array = [];     // Create array
array[5000] = 1;
'1' in array;       // false: The key does not exists
Object.keys(array); // 5000 (it's the only key)

如果您想使用数组吹拂新浏览器,请填充类型化数组:

var array = new ArrayBuffer(6e9); // 6 Gigs

可以在Chrome中轻松验证两者:打开控制台和内存控制台(Shift + Esc),然后粘贴代码。 window.a=new Array(6e9);window.a=[];window[6e9]=1;不会导致显着的内存增加, 当window.a=new ArrayBuffer(6e9);崩溃页面时。

PS。 6e9 === 6000000000

答案 1 :(得分:0)

Javascript实际上是由浏览器解释和运行的,因此它取决于浏览器如何实现此行为。从理论上讲,一旦你执行了数组[5000],就会有一个5001个元素的数组,除了5001个未定义之外。

虽然如果我是实现运行此类脚本的逻辑的那个,undefined如果没有分配给其他任何东西,它将是默认值,这意味着我可能会定义一个带有1个条目的地图,分配密钥5000值1.对数组中任何其他值的任何访问都将自动返回undefined,而不必进行不必要的工作。

这是对此here的测试。如您所见,警报立即可见。

答案 2 :(得分:0)

JS数组实际上不是数组,因为您可以从其他编程语言(如C,C ++等)中了解它们。它们是具有数组的对象,就像访问它们一样。这意味着当您定义array[5000] = 1;时,实际上定义了数组对象的5000属性。

如果您使用了字符串作为数组键,那么您也可以将索引作为属性来访问以演示此行为,但由于变量名称不能以数字array.5000开头,因此无效。

array['key'] = 1;
alert( array.key ); // Gives you 1

这意味着数组可能会像对象一样实现,尽管每个实现都可以自由优化,从而为您提供除了可以定义object.aobject.z而无需定义的对象的行为。整个字母。