4

我有一种情况,我可能正在设置一个高索引的数组单元格,而没有设置它之前的任何单元格。

>>> var arr = [];
undefined
>>> arr[5] = 'value';
"filled"
>>> arr
[undefined, undefined, undefined, undefined, undefined, "filled"]

这样的数组是如何存储在内存中的?是否为每个未定义的值分配了空间?

在我的实际项目中,我可能会使用非常大的索引。例如,我可以设置单元格 500-800 和 900-1000。我不能使用哈希,因为我需要遍历这些非空单元格并注意它们的索引。我想知道像这样分割数组是否会为空单元格占用大量内存。

4

3 回答 3

1

我不能使用哈希,因为我需要遍历这些非空单元格并注意它们的索引。

for (x in ...)语言结构有什么问题?

编辑以适应vol7ron的评论:

var x = {2: "foo", 999: "bar"};

for ( var n in x ) {
    if ( x.hasOwnProperty(n) ) {
        console.log(n);
        console.log(x[n]);
    }
}  
于 2012-04-13T18:11:46.073 回答
1

绑在 aefxx 的答案上,您仍然可以迭代:

var obj = {500: "foo",  10923: "bar"};
var max = 0;

for (var key in obj)
   max=key>max?key:(max||key);         // get max key

for (var i=0; i<=max; i++)
   console.log(obj[i]);                // output even the undefined

正如 Phrogz 评论的那样,它不会为数组的未声明元素分配。arr[somenum] = undefined;如果您将元素值显式设置为未定义(例如),我不确定是否是这种情况

于 2012-04-13T18:37:33.783 回答
0

您可能应该简单地将最大索引存储在一个变量中,然后像这样访问您的地图:

for (var i=0; i<=maxIndex; i++) {
 console.log(myMap[i]);
}

然后,您将拥有地图的(相对)紧凑性以及遍历未设置索引的能力。

于 2012-04-13T18:13:43.153 回答