【发布时间】:2010-01-11 04:25:07
【问题描述】:
我正在用 JavaScript 编写大量年度数据,我正在考虑将其添加到数组中,使用年份作为数组索引并将数据放入数组中。然而,Firebug 似乎表明 JavaScript 通过在数组中用“未定义”填充两千个奇数条目来处理这个问题。随着数百个这样的数组在活动内存中运行,我担心数十万个无用数组项的开销可能会开始减慢程序速度。会吗?
【问题讨论】:
标签: javascript arrays memory-management
我正在用 JavaScript 编写大量年度数据,我正在考虑将其添加到数组中,使用年份作为数组索引并将数据放入数组中。然而,Firebug 似乎表明 JavaScript 通过在数组中用“未定义”填充两千个奇数条目来处理这个问题。随着数百个这样的数组在活动内存中运行,我担心数十万个无用数组项的开销可能会开始减慢程序速度。会吗?
【问题讨论】:
标签: javascript arrays memory-management
当您将数字索引的值设置为高于数组的当前 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
总之,数组意味着包含顺序索引,从零开始,如果你的属性不满足这些要求,你应该简单地使用一个对象。
【讨论】:
是的,很有可能。您应该考虑改用 JavaScript 对象:
var years = {2009: 'Good', 2010: 'Better'};
【讨论】:
好吧,如果你迭代成千上万个未定义,它会影响整个程序的速度,但不确定你是否会注意到它。
【讨论】:
另一方面,有时稀疏数组比自定义对象更易于使用, 并且数组有这样方便的方法可用。
在日历应用程序中,我从使用中的每一年的对象开始,但每一年由十二个成员(月数组)组成,每个“月”是重要日期的稀疏数组,其长度取决于最高日期有任何数据的那个月。
【讨论】: