JavaScript是否填充空数组项?

JavaScript是否填充空数组项?,javascript,arrays,memory-management,Javascript,Arrays,Memory Management,我正在用JavaScript编写大量年度数据,并考虑将其添加到数组中,使用年度作为数组索引,并将数据放入数组中。然而,Firebug似乎表明JavaScript通过在数组中填充两千多个“未定义”项来处理这个问题。由于活动内存中有数百个这样的数组,我担心数十万个无用数组项的开销可能会开始降低程序的速度。会吗?是的,很有可能。您应该考虑使用JavaScript对象来代替: var years = {2009: 'Good', 2010: 'Better'}; 如果将数值索引的值设置为高于数组的当前

我正在用JavaScript编写大量年度数据,并考虑将其添加到数组中,使用年度作为数组索引,并将数据放入数组中。然而,Firebug似乎表明JavaScript通过在数组中填充两千多个“未定义”项来处理这个问题。由于活动内存中有数百个这样的数组,我担心数十万个无用数组项的开销可能会开始降低程序的速度。会吗?

是的,很有可能。您应该考虑使用JavaScript对象来代替:

var years = {2009: 'Good', 2010: 'Better'};

如果将数值索引的值设置为高于数组的当前
length
,则
length
属性将受到影响

简而言之,您应该使用
对象

var data = {};
data[year] = "some data";

// or
var data = {
  2009: "2009 data",
  2010: "2010 data"
};
现在我回答题为“JavaScript是否填充空数组项?”的问题

不,正如我前面所说,只有
length
属性被更改,(如果需要,只有当添加的索引大于当前的
length
),
length
增加到比该索引的数值多一个

这些方法的工作假设数组对象的索引从零开始

前面的索引在
数组中并不存在,您可以测试它:

var array = [];
array[10] = undefined;

array.hasOwnProperty(10); // true
array.hasOwnProperty(9);  // false

总之,数组应该包含顺序索引,从零开始,如果您的属性不满足这些要求,您应该只使用一个对象。

好吧,如果您迭代数千个未定义的对象,它将影响总体程序速度,但不确定您是否会注意到。

另一方面,有时稀疏数组比自定义对象更易于使用, 而数组也有这样方便的方法


在日历应用程序中,我从使用中的每年的对象开始,但每年由十二个成员(月数组)组成,每个“月”是一个稀疏的有效日期数组,其长度取决于该月有任何数据的最高日期

没关系,因为钥匙是等价的。这只是一个品味的问题。你可能会:1024个空节点在FF 3.5.6中需要大约2ms的时间-这确实有助于澄清阵列的工作原理。我已切换到对象文字。相关问题: