JavaScript是否填充空数组项?

时间:2010-01-11 04:25:07

标签: javascript arrays memory-management

我正在使用JavaScript编写大量年度数据,我正在考虑将其添加到数组中,使用year作为数组索引并将数据放入数组中。但是,Firebug似乎表明JavaScript通过用“undefined”填充数组中的两千多个条目来处理这个问题。有数百个这样的阵列在活动内存中徘徊,我担心数十万个无用数组项的开销可能会使程序开始变慢。会吗?

4 个答案:

答案 0 :(得分:11)

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

简而言之,您应该使用Object

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

// or
var data = {
  2009: "2009 data",
  2010: "2010 data"
};

现在我回答问题标题:“ JavaScript是否填充空数组项?

不,正如我之前所说,只更改了length属性(如果必要,仅当添加的索引大于当前length时),length会增加到比该索引的数值多一个。

Array.prototype方法的工作原理是假设数组对象的索引从零开始。

以前的索引在Array对象中并不存在,您可以对其进行测试:

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

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

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

另一方面,有时稀疏数组比自定义对象更容易使用, 和数组有这么方便的方法。

在日历应用程序中,我从每年使用的对象开始,但每年由12个成员(月数组)组成,每个'月'是一个稀疏的重要日期数组,其长度取决于最高日期那个月有任何数据。