2012-04-07 86 views
1

如果任何人知道如何存储与JS数组,如果你有一个高值开始的数组处理我不知道。内存分配给数组

例如,如果你有:

array[5000] = 1; 

随着阵列中的第一个值,5000之前一切根本不存在,将存储器分配给阵列的量满足未分配的4999个位置之前到它......或者它只会将内存分配给数组中的值[5000]?

我试图削减想知道这个问题的:)

回答

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

+2

这说明什么? – 2012-04-07 15:52:07

+0

@Rob W所以你说它会为所有5000分配内存? – Sir 2012-04-07 15:54:28

+0

@Dave只有第5000个密钥的内存才被保留,其他密钥不存在,并且没有为这些内存保留内存。 – 2012-04-07 15:57:37

0

JavaScript是真正的解释和浏览器上运行,所以它依赖于浏览器是如何实现这种行为。理论上,一旦你做了数组[5000],你就有一个5001个元素的数组,除了5001st是未定义的。

虽然如果我是执行运行此类脚本的逻辑的人,undefined将作为默认值(如果未分配给其他任何其他值),这意味着我可能无法定义带有1项将键5000分配给值1的映射。对数组中任何其他值的访问都会自动返回undefined,而不必做不必要的工作。

下面是这个here的考验。正如你所看到的,警报立即出现。

0

JS数组实际上是不是数组,你从如C,C++等,他们是其他编程语言知道他们喜欢访问它们的方式,而不是数组对象。这意味着当你定义array[5000] = 1;时你实际上定义了数组对象的5000属性。

如果您使用了一个字符串作为数组键,您将能够访问索引作为属性以及演示此行为,但由于变量名不能以数字array.5000开头将是无效的。

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

这意味着阵列很可能会实现很像对象,虽然每个实现可以自由地优化,从而给你,你的行为,除了从那里你可以定义object.aobject.z没有确定整个字母对象。