在这种情况下,数组大小是否在javascript中很重要?

时间:2009-09-22 14:29:00

标签: javascript arrays memory-management

只要在页面上单击相应的按钮,我就会使用数据库中的项目ID在javascript中创建一个数组。每个数组条目都将存储一个自定义对象。

特定数据库中来自特定数据库的ID可以从80123到80223之间的任何数字开始,用于该特定数据页面。

所以数组中的第一个条目就像arr [80123]。

现在,当我检查阵列的长度时,它显示我80123!即使它只有1个元素,我想到使用关联或字符索引数组,但它们缺少一些我需要的基本排序操作。

现在我的问题是“如果数组中只有1个元素,但数组的长度是80123,那么数组实际消耗的内存是多少?”

更多信息......

基数不断变化80123只是一个例子。

使用的代码如下:

function ToggleAction(actionButtonID, action) 
    {
        var extractedID = ExtractNumericIdFromTag(actionButtonID);
        var arrayIndexer = extractedID; // Can update this to make array associative

        if(actionItems[arrayIndexer] == null)
        {
            actionItems[arrayIndexer] 
                = new ActionItem(extractedID, action);
        }
        else
        {
            var ai = actionItems[arrayIndexer];
            ai.action = action;
        }
    }

6 个答案:

答案 0 :(得分:6)

您的代码没有分配那么多内存,因此您不必担心这一点。 Javascript Arrays非常聪明。但是,在这种情况下,我仍然认为你应该使用Object而不是Array ...

var num = 80123;
var obj = {};
obj[num] = { Name: "Josh" };

alert(obj[80123].Name);

答案 1 :(得分:3)

Javascript中的数组只是具有一些特殊属性的哈希值(主要是“length”属性将始终返回高于最高整数键的值)。

我不相信任何实现会分配大量内存只是因为你最初分配了一些非常高的索引。

答案 2 :(得分:1)

尝试在Firebug中运行以下代码:

var a = [];
a[663] = "a";
a.length == 664;

返回

true

如果你再尝试

console.log(a)

你会得到:

[undefined, undefined, undefined,  ...... , undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, "a"]

这消耗了多少内存可能是你正在使用哪个引擎的问题,但它看起来就像有很多插槽被分配来保持没有价值。

我认为你真正想要使用的只是一个简单的对象式地图,如下所示:

var a = {};
a[664] = "a";
a[323] = "b";
a

产生:

Object 664=a 323=b

更适合映射id-> object的关联。

如果您稍后需要遍历此对象以访问所有对象,请使用以下代码:

for(var id in a){
  if(a.hasOwnProperty(id)){
    console.log("id:",id," object:",a[id]);
  }
}

答案 3 :(得分:0)

你是如何定义阵列的?如果使用Array对象,则必须有多个参数才能使浏览器将参数解释为值,而不是数组的长度。我总是尝试使用文字数组语法:a = [80123];a = [80123,80124];

答案 4 :(得分:0)

我不确定js数组的行为,但我认为你在这里很安全。

如果不是,我认为您可以考虑根据id的最小值(在您的示例中为80123)更改数组的索引,以便数组索引从零开始。

index = id - minID;

这可能需要在(很多)其他地方更改代码,所以只有在绝对必要的情况下才能进行更改。

答案 5 :(得分:0)

这个问题之前已经被暗示过了:

Which takes less memory: a Javascript array or Javascript object?

理论上,在Javascript中,数组 IS 是一个对象。在数组中唯一改变(在内存中)的是.length属性。它将显示下一个最高的数组索引,但这并不意味着分配的数组实际上有很多元素。