1

我正在开发一个 HTML5 画布游戏,并且我有一组图像被绘制到画布上。数组中的图像当前都被正确绘制,我有一个 console.log 行,我想用它来在控制台中显示数组的大小。但由于某种原因,控制台一直告诉我数组长度未定义。

我用来打印数组长度的行是:

console.log("sources array length = " + sources.length);

它在一个 for 循环中:

        for (index=0;index < numImages ;index++){
        console.log(index);
        images[index] = new Image();
        images[index].src = sources[index];
        console.log("Adding " + sources[index]);
        callback(images[index]);
        console.log("sources array length = " + sources.length);
    }

如您所见,我在循环中有另一个 console.log 语句,用于记录每次运行循环...

console.log(index); 

此行在每次运行循环时打印变量 index 的值,从 0 开始,每次增加 1,直到循环到达等于变量 'numImages' 的值时结束。

但是,由于某种原因,每次循环运行时,应该打印数组长度的行都显示“源数组长度=未定义”,而不是数组的实际长度。

谁能向我指出这是为什么?每次运行循环时,如何让它显示源数组的长度?

编辑 13/02/2013 @ 15:10

源数组在同一个文件中定义,使用以下行:

var sources = {};

我没有为数组定义设定长度的原因是因为我需要它的长度是动态的。然后我使用这样的行将元素添加到数组中:

sources[0] = document.getElementById("building").src,
sources[1] = document.getElementById("chair").src,
sources[2] = document.getElementById("drink").src,
sources[3] = document.getElementById("food").src,

所以我想要我的console.log 行做的是告诉我当前数组的长度,即添加了多少元素。正如您在原始帖子中的第一段代码中看到的那样,我有一个 console.log ,每次将元素添加到源数组时,它都会向控制台打印一条消息 - 它们显然被正确添加,否则,它们不会显示在画布上......因此数组必须具有在图像绘制到画布时定义的长度,否则它们不会在要绘制的数组中。

4

1 回答 1

3

但是,由于某种原因,每次循环运行时,应该打印数组长度的行都显示“源数组长度=未定义”,而不是数组的实际长度。

...这告诉我们sources没有length属性,因此不是数组。完全有可能构建不是数组但仍然具有名称如0,1等的属性。例如:

var sources = {0: "zero", 1: "one", 2: "two"};
console.log(sources[0]); // "zero"
console.log(sources.length); // "undefined"

如果您sources通过输出一些服务器端信息来获得,它很可能以上面的形式输出(一个带有数字属性名称的普通对象,可能会用引号引起来)而不是一个实际的数组,看起来像这:

var sources = ["zero", "one", "two"];

重新编辑

源数组在同一个文件中定义,使用以下行:

var sources = {};

我没有为数组定义设定长度的原因是因为我需要它的长度是动态的。然后我使用这样的行将元素添加到数组中:

sources[0] = document.getElementById("building").src,
sources[1] = document.getElementById("chair").src,
sources[2] = document.getElementById("drink").src,
sources[3] = document.getElementById("food").src,

这不是问题,JavaScript 数组是动态的(事实上,它们根本不是真正的数组 ——或者至少,标准类型不是,有更新的类型实际上是数组)。所以只要改变

var sources = {};

var sources = [];

使它实际上是一个数组。然后你可以按照你已经在做的方式添加到数组中(这绝对没问题),或者你可以使用sources.push(document.getElementById("chair").src);等来代替。

于 2013-02-13T14:52:03.567 回答