我正在使用JavaScript编码很多年度数据,考虑将其添加到数组中,使用年份作为数组索引并将数据放入数组中。然而,Firebug似乎表明JavaScript通过用"undefined"填充两千多个条目来处理此操作。随着数百个这样的数组在活动内存中存在,我担心成千上万的无用数组项的开销可能会开始减慢程序的运行速度。这样做会吗?
我正在使用JavaScript编码很多年度数据,考虑将其添加到数组中,使用年份作为数组索引并将数据放入数组中。然而,Firebug似乎表明JavaScript通过用"undefined"填充两千多个条目来处理此操作。随着数百个这样的数组在活动内存中存在,我担心成千上万的无用数组项的开销可能会开始减慢程序的运行速度。这样做会吗?
当你将一个数字索引的值设置为比当前数组的 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'};
如果你迭代了成千上万个未定义的变量,它会影响整个程序的速度,不过我不确定你是否会注意到这一点。
另一方面,有时候使用稀疏数组比使用自定义对象更简单,并且数组具有非常方便的方法。
在一个日历应用程序中,我会为每个正在使用的年份创建对象,但每个年份都包含一个由十二个成员(月份数组)组成的数组,而每个“月份”都是一个稀疏数组,其中包含重要日期,其长度取决于该月份具有任何数据的最高日期。