1

我有一个数组定义为:

var subjectCache = [];

然后我有一些代码来构建它,这工作正常。

但是,如果我尝试通过索引引用数组,例如:

var x = subjectCache[0];

或者

var x = subjectCache[1];

我明白了undefined。也subjectCache.length始终为 0(零)。

如果我尝试通过它的键来引用它,例如:

var x = subjectCache['12345'];

有用。

这是正常的吗?我不应该通过它的索引来引用它吗?

我正在使用 Internet Explorer,如果它有所作为(它可能会:()

[编辑]

这是我用来构建数组的代码,虽然我真的不认为这是罪魁祸首。

这是来自网络服务调用的回调。这工作正常,并且正在填充数组。

var subjectCache = [];
var subjectCacheCount = 0;

function refreshSubjectsCallback(data) {
    // update subjects
    // loop through retrieved subjects and add to cache
    for( i=0; i < data.length; i++ )
    {
        var subject = data[i];
        var subjectid = subject.SubjectId;
        subjectCache[subjectid] = subject;
        subjectCacheCount += 1;
    }
}

[/编辑]

4

5 回答 5

3

您可能是手动分配键而不是使用subjectCache.push()向数组添加新元素:

var array = [];

array['foo'] = 'bar';

console.log(array.length);  // 0

length属性不会以您期望的方式反映这些更改:

> var a = [];
undefined
> a[100] = 2;  // The previous `100` entries evaluate to `undefined`
2
> a.length;
101

相反,使用一个对象:

var object = {};

object['foo'] = 'bar';

for (var key in object) {
    var value = object[key];

    console.log(value);
}
于 2012-10-03T15:28:13.440 回答
1

从您的症状来看,听起来您正试图将数组视为关联数组。

在 Javascript 中,数组的工作方式如下:

var a = [];
a[1] = 10;
alert(a.length);

对象的工作方式如下:

var o = {};
o.myProp = true;
o["myOtherProp"] = false;
于 2012-10-03T15:24:51.223 回答
1

数组只适用于数字键而不是字符串。字符串将属性分配给对象,不计入length数字索引的一部分,也不计入数字索引。

构建数组时,请确保分配给数组中的数字位置。

于 2012-10-03T15:25:30.290 回答
1

不,它不起作用,因为您没有创建数组而是对象。您将必须通过其密钥访问它。

var x = subjectCache['12345'];

如果这有效而subjectCache.length无效,我认为您正在制作一个对象而不是数组。你很困惑。

于 2012-10-03T15:25:52.000 回答
1

在路上的某个地方,你丢失了数组,变量subjectCache指向了另一种对象。

如果它是一个数组,它的长度不能为零并且包含一个可以使用subjectCache['12345']. 当您访问数组中的项目时,使用数字索引或表示数字的字符串没有任何区别。

于 2012-10-03T15:32:08.373 回答