JavaScript会填充空数组项吗?

10

我正在使用JavaScript编码很多年度数据,考虑将其添加到数组中,使用年份作为数组索引并将数据放入数组中。然而,Firebug似乎表明JavaScript通过用"undefined"填充两千多个条目来处理此操作。随着数百个这样的数组在活动内存中存在,我担心成千上万的无用数组项的开销可能会开始减慢程序的运行速度。这样做会吗?


相关问题:https://dev59.com/unM_5IYBdhLWcg3wvV5w - James B
4个回答

12

当你将一个数字索引的值设置为比当前数组的 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
谢谢 - 这真的帮助我澄清了数组的工作原理。我已经转换为对象字面量。 - futuraprime

4

是的,很可能需要这么做。您应该考虑使用JavaScript对象代替:

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

2
没关系,作为键它们是等价的。只是个人口味不同。 - Justin Johnson

0

如果你迭代了成千上万个未定义的变量,它会影响整个程序的速度,不过我不确定你是否会注意到这一点。


1
可能会: 在Firefox 3.5.6中,1024个空节点大约需要2毫秒。 - Justin Johnson

0

另一方面,有时候使用稀疏数组比使用自定义对象更简单,并且数组具有非常方便的方法。

在一个日历应用程序中,我会为每个正在使用的年份创建对象,但每个年份都包含一个由十二个成员(月份数组)组成的数组,而每个“月份”都是一个稀疏数组,其中包含重要日期,其长度取决于该月份具有任何数据的最高日期。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接