【问题标题】:Does JavaScript populate empty array items?JavaScript 是否填充空数组项?
【发布时间】:2010-01-11 04:25:07
【问题描述】:

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

【问题讨论】:

标签: javascript arrays memory-management


【解决方案1】:

当您将数字索引的值设置为高于数组的当前 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

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

【讨论】:

  • 谢谢 - 这确实有助于阐明数组的工作原理。我已经切换到对象文字。
【解决方案2】:

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

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

【讨论】:

  • 没关系,因为它们是等效的键。这只是口味问题。
【解决方案3】:

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

【讨论】:

  • 可能:1024个空节点在FF 3.5.6中大约需要2ms
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 2017-03-17
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    相关资源
    最近更新 更多